一、JSP常用内置对象生命周期
在jsp中直接可以用<%//Java代码%>直接使用的某些类的实例化对象。他们主要负责在一定域内进行数据沟通,并对应着servlet的service方法的局部变量。
1、out:JspWriter
JspWriter和HttpWriter共同继承于Writer类,属于字符输出流。主要用于直接在页面内输出数据。
2、request:HttpServletRequest
用于服务器向客户端传递数据,并作为请求数据的参数。
生命周期
服务器接收到请求时由服务器创建;服务器返回数据后由服务器销毁。仅存在于一次数据请求和响应中。
3、response:HttpServletResponse
生命周期
服务器接收到请求时由服务器创建;服务器返回数据后由服务器销毁。仅存在于一次数据请求和响应中。
4、session:HttpSession
生命周期
同一次浏览器与服务器的会话(从浏览器请求某个站点到浏览器完全关闭)范围内存在。当前浏览器的窗口内可访问,窗口关闭后销毁。
5、application:
生命周期
服务器开启时创建,服务器关闭时销毁。
二、Cookie将数据放在客户端的技术
未登陆账号的用户需要做一些操作时可以使用cookie将数据保存在客户端本地,待登陆后再同步到服务器。
1、创建方式及响应展示
@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//打印响应日志
System.out.println("SetCookieServlet.service");
//服务器构造cookie对象
Cookie cookie = new Cookie("ppp","呸呸呸");
//将构造好的cookie对象回复到客户端
resp.addCookie(cookie);
}
}
2、服务器同步Cookie
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//打印日志
System.out.println("GetCookieServlet.service");
//接收Cookie
Cookie[] cookies = req.getCookies();
//遍历打印
PrintWriter out = resp.getWriter();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
out.println(cookie.getName()+":"+cookie.getValue());
}
}
}
3、cookie生命周期
(1)默认情况下关闭浏览器Cookie就删除。
(2)也可以通过成员方法自定义生命周期
cookie.setMaxAge(10*60);//保存十分钟
参数小于零属于默认情况
参数等于零是立即删除自己和所有同名cookie
三、Filter web项目的过滤器
创建示例
/*
* 1、定义过滤器名字:filterName = "encoding"
* 2、指定拦截路径:urlPatterns = "/*"
* 当前拦截路径是所有路径
* */
@WebFilter(filterName = "encoding" , urlPatterns = "/*")
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("EncodingFilter.init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("EncodingFilter.doFilter");
/*
* 判断当次请求是否满足当前页面要求的必备条件:
* 比如账号登陆、是否完成缴费……
* */
//满足条件的放行语句
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("EncodingFilter.destory");
}
}
四、ServletContext共享类
与服务器的启动同在,是所有用户都可以访问的数据域对象。可以用来做公共聊天室。
//set
@WebServlet("/setServletContext")
public class SetServletContext extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
servletContext.setAttribute("name","木无表情");
HttpSession session = req.getSession();
PrintWriter out = resp.getWriter();
User user = (User) session.getAttribute("user");
out.println(user.getName());
}
}
//get
@WebServlet("/getServletContext")
public class GetServletContext extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
HttpSession session = req.getSession();
PrintWriter out = resp.getWriter();
User user = (User) session.getAttribute("user");
out.println("ServletContext:"+servletContext.getAttribute("name"));
out.println("当前用户名:"+user.getName());
}
}