- 配置文件
<servlet>
<servlet-name>dateServlet</servlet-name>
<servlet-class>web.DateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dateServlet</servlet-name>
<url-pattern>/date</url-pattern>
</servlet-mapping>
- 重定向和转发
重定向:服务器发送302状态码和Location消息头,浏览器收到后消息头中的地址发送请求;
转发:一个servlet没做完就给另一个servlet来做,一般是jsp
response.sendRedirect(String url);
request.setAttribute(String name,Object obj);//绑定数据到requset上
RequestDispatcher rd = request.getRequestDispatcher(String url);//获取转发器
rd.forward(request,response);//转发
- cookies和session
cookies:服务端会以set-cookie消息头将数据发送给浏览器,浏览器会保存,当浏览器访问相同路径是会将cookie返回;cookie路径:该路径和该路径的子路径有效。
session:当服务器接收到请求后,可以创建一个session对象,此session对象会生成一个sessionId,后将sessionId以cookie的方式返回给浏览器;
//创建并发送cookie
Cookie c = new Cookie(String name,String value);
注:
cookie只能存放字符串。
response.addCookie(c);
//读取cookie
Cookie[] cookies = request.getCookies();
String cookie.getName();
String cookie.getValue();
HttpSession session = request.getSession();
/*先查看请求当中有没有sessionId,如果没有,
则创建一个session对象;如果有sessionId,则依据该sessionId
查找对应的session对象,如果找到了,则返回该session对象,如果
找不到,则创建一个新的session对象。*/
session.setAttribute(String name,Object obj);
session.getAttribute("name");
session登录验证,登陆后创建session,并setAttribute(“user”,user),再次访问时获取session,并getAttribute(“user”),如果返回值为null,则未登录,重定向到登录页面,如果不为null,则登录过。
- servlet生命周期
1.创建:
可以收到请求后创建,也可以容器启动后就创建
<load-on-startup>1</load-on-startup>
2.初始化init(),主要用来读取中的参数,servlet的父类GenericServlet提供了getServletConfig()方法来获取config对象(保存了中的数据)
web.xml:
<servlet>
<servlet-name>BmiServlet</servlet-name>
<servlet-class>web.BmiServlet</servlet-class>
<init-param>
<param-name>male</param-name>
<param-value>25,20</param-value>
</init-param>
<init-param>
<param-name>female</param-name>
<param-value>24,19</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>BmiServlet</servlet-name>
<url-pattern>/bmi</url-pattern>
</servlet-mapping>
读取参数
@Override
public void init() throws ServletException {
//读取初始化参数
ServletConfig config = getServletConfig();
String male = config.getInitParameter("male");
String female = config.getInitParameter("female");
}
3.就绪
调用service(request,response)方法
4.销毁
容器在删除servlet对象之前,会调用该对象的destroy方法。
- 过滤器
当servlet容器收到请求之后,如果有过滤器,会先调用;
step1.写一个java类,实现Filter接口。
step2.在接口方法当中,实现拦截处理逻辑。
public void doFilter(request,response,chain){
String content = request.getParameter("content");
if(content.indexOf("狗") != -1){
response.getWriter().println("评论包含了违禁词");
}else{
/*
* 继续向后执行(即调用后续的过滤器或者是Servlet)。
*/
chain.doFilter(req, res);
}
}
/**
* 容器在创建好过滤器实例之后,会调用该实例的init方法。
* 注:该方法只会执行一次。
* FilterConfig对象类似于ServletConfig,可以用来读取初始化参数。
*/
public void init(FilterConfig arg0) throws ServletException {
System.out.println("CommentFilter的init方法");
}
step3.配置过滤器(web.xml)。
<filter>
<filter-name>commentFilter</filter-name>
<filter-class>web.CommentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>commentFilter</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
- servlet上下文
容器启动之后,会为每一个web应用创建唯一的一个符合ServletContext接口要求的对象(即Servlet上下文),该对象会一直存在,除非容器关闭。ServletConfig,FilterConfig,GenericServlet,HttpSession都提供了getServletContext方法。setAttribute、getAttribute来绑定数据,绑订到servlet上下文上的数据,所有用户都能共享;绑订到这些对象上的数据,生存时间长短是不一样的(request < session < servlet上下文)。
ServletContext读取全局参数
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
- 监听器
用来监听容器产生的事件并进行 相应的处理,如:创建或销毁了request,session,servlet,或调用了他们的setAttribute(),removeAttribute()方法
使用创建session或销毁session监听器监测在线人数
public class CountListener implements HttpSessionListener{
//容器在创建session对象时调用此方法
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
ServletContext sctx = session.getServletContext();
Integer count = (Integer)sctx.getAttribute("count");
if(count == null){
count = 1
}else{
count++
}
sctx.setAttribute("count",count);
}
//容器销毁session时执行此方法
public void sessionDestroy(HttpSessionEvent arg0){
ServletContext sctx = arg0.getSession.getServletContext();
sctx.setAttribute("count",sctx.getAttribute("count"));
}
}
<listener>
<listener-class>web.CountListener</listener-class>
</listener>