ServletContext(⽣命周期、对象的获取、记录访问次数、getServletCo。。。⼀、ServletContext对象
每⼀个Web⼯程对应于⼀个ServletContext对象,此对象代表web应⽤,由服务器创建,可以解决不同⽤户的数据共享问题。
1、⽣命周期:
创建:web应⽤被加载到服务器或服务器开启。
销毁:web应⽤被移除或服务器关闭。
2、对象的获取:
(1)实现Servlet接⼝的类内部:
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext= ServletContext();
}
(2)getServletContext():
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext=getServletContext();
}
(3)通过Session获取:
ServletContext Session().getServletContext();
3、ServletContext对象的应⽤:
(1)获得初始化参数(l的全局数据):
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
<context-param>//⼀组标签只能存储⼀组键值对
<param-name>zhai</param-name>
<param-value>zhai1997</param-value>
</context-param>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext=getServletContext();
String InitParameter("zhai");//由键获取值
System.out.println(paramvalue);
}
如果数据不存在,返回NULL。
(2)获得⼯程发布后的绝对路径:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext=getServletContext();
String RealPath("/");
System.out.println(realpath);
String RealPath("/");
System.out.println(realpath1);
String RealPath("../⼯程.text");
System.out.println(realpath2);
}
getRealPath的参数为相对于web的路径,因为发布到服务器的时候只发布web⽂件中的内容,因此:⼯程.text⽂件不能被访问到。
(3)域对象(作⽤范围为整个web应⽤)
Servlet1:创建ServletContext对象设置键和值(数据存储):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext=getServletContext();
servletContext.setAttribute("name","zhai");
}
Servlet2:由键获取值:
String attribute=(ServletContext().getAttribute("name");
System.out.println(attribute);
}
需要先访问Servlet1设置键和值,再去访问Servlet2获取值。如果不存在返回NULL。
⼆、ServletContext对象应⽤——三天免登录(记录访问次数)
1、⽤到的知识点:
(1)Cookie
(2)Session
(3)ServletContext
其中Cookie和Session是会话技术的组成部分,⼀次会话从打开浏览器的某个站点开始,到浏览器关闭为⽌。如打开浏览器中的淘宝时⼀次会话开始,关闭浏览器的时候此次会话结束。
要想实现三天免登录记录⽹站访问次数的功能,只有Cookie和Session技术是不⾏的,因为Cookie实现的的是免登录功能。通过创建Cookie,⽣成了Cookie⽂件,在下次登录时可以直接读取Cookie中的⽤户信息,不⽤重新输⼊账户和密码。Session的运⽤解决的是不同请求的数据共享问题,即创建了Session后,在访问不同的页⾯的时候,可以通过Request对象获取Session的值。
要想记录页⾯访问的次数,要⽤到ServletContext技术,可以解决不同⽤户的数据共享问题。即ServletContext中的值是所有⽤户共享的。可以获取或修改值。
2、过程分析:
第⼀次登录(没有Sessio和Cookie):
需要进⾏⼿动登录。
⾸次登录后(Cookie未过期之前)登录:
MainServlet的运⾏结果:
因为Session的运⽤在CookieServlet中存储的Session中的数据,在MainSewrvlet中依旧能够调⽤。
由于SertvletContext的运⽤,浏览量会递增,不会因为浏览器、服务器的关闭⽽造成数据从0开始增加。
3、代码分析:
CookieServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
Cookie[] Cookies();
Connection con=null;
login log= null;
int successNum=0;
try {
con= Connection();
QueryRunner qr = new QueryRunner();
String sql = "Select * from login";
List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class)));
if(cookies!=null) {//验证数据库中是否有与Cookie对应的⽤户
for (int i = 0; i < list.size(); i++) {
log= (i);
for (Cookie cookie : cookies) {
if((Account().Name()))&&(Password().Value()))){                            HttpSession Session();el表达式获取session中的值
httpSession.setAttribute("login",log);
ServletContext servletContext = ServletContext();//获取ServletContext对象
if((Attribute("contextNum"))!=null) {
int num=Integer.Attribute("contextNum").toString());
num++;
servletContext.setAttribute("contextNum",num);//将int类型的num储存到contextNum
}else{
servletContext.setAttribute("num",1);
}
successNum++;
}
}
}
if(successNum>=1){
response.sendRedirect("/Servlet_login_war_exploded/main");
}
else{
}
}
else{
}
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
有Cookie则⽤数据库校验,成功直接进⼊主页⾯,并⽣成Session和ServletContext,不成功则请求转发到登录页⾯重新进⾏登录。MainServlet:
login log= (login) Session().getAttribute("login");
int num=(ServletContext().getAttribute("contextNum");
通过Session和ServletContext获取CookieServlet中的数据。
LogServlet:
try {
Connection();
QueryRunner qr = new QueryRunner();
String sql = "Select * from login where account=? and password=?";
Object[] select = {account,password};
log = qr.query(con, sql, new BeanHandler<login>((login.class)), select);
if(log!=null){
Cookie cookie=new Cookie(account,password);
cookie.setPath("/Servlet_login_war_exploded/cookie");
cookie.setMaxAge(3*24*3600);
response.addCookie(cookie);
}
else{
}
是在⽆Cookie或数据库校验失败的情况下调⽤的,数据库中有⽤户信息则⽣成Cookie。
4、问题分析(类型转换错误):
错误代码:
int num=(int) ServletContext().getAttribute("contextNum");
原因:ServletContext().getAttribute("contextNum")为Object类型,需要先转换为String类型,再转换为int类型:
int num=Integer.Attribute("contextNum").toString());

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。