一、Servlet生命周期中的方法
因为Servlet中没有main()方法,不能独立运行,其运行主要靠Tomcat服务器控制和调度。
生命周期:指的是ServletContext中何时创建Servlet容器,调用其doGet()、doPost()等做出请求、响应的方法,何时进行销毁其实例的方法。
1、init (ServletConfig config),在 Servlet 实例创建之后执行
public void init(ServletConfig config) throws ServletException {
System.out.println("实例创建了Servlet");
}
2、service ( ServletRequest req, ServletResponse res)方法,由 Servlet 容器调用,用来处理客户端的请求
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("服务调用了Service()方法");
}
doGet()方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
doPost()方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//调用doGet方法才会起作用,统一处理
doGet(request, response);
}
3、destroy ( )由 Servlet 容器调用,释放Servlet对象所使用的资源,销毁Servlet对象
public void destroy() {
System.out.println("实例销毁了Servlet对象");
}
二、request请求中的方法
1、setCharacterEncoding (String charset )、设置请求体的字符编码
request.setCharacterEncoding("utf-8");
2、getParameter ( String name ) 、获取请求参数
String uname = request.getParameter("uname");
3、String[ ] getParameterValues (String name )、返回指定请求参数的全部值
String[] hobbys = request.getParameterValues("hobby");
4、setAttribute (String name, Object object )、在请求中保存名称为name的属性
request.setAttribute("lo", findLo);
5、getAttribute ( String name )、获取名称为name的属性值
Login log = (Login)request.getAttribute("lo");
6、removeAttribute (String name)、清除请求中名字为name的属性
session.removeAttribute("bname");
7、 getRequestDispatcher( String path )、返回指向指定路径的请求分发对象
request.getRequestDispatcher("login.do").forward(request, response);
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保 存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然存在,则在 请求转发的过程中可以通过 request 来传输/共享数据。
三、response响应中的方法
1、getWriter ( )、返回PrintWriter对象,用于向客户端发送文本
PrintWriter out = response.getWriter();
String html="<!DOCTYPE html>\r\n"
+ "<html>\r\n"
+ " <head>\r\n"
+ " <meta charset=\"utf-8\">\r\n"
+ " <title></title>\r\n"
+ " </head>\r\n"
+ " <body>\r\n"
+ " <h1>性别:"+log.getLid()+"</h1>\r\n"
+ " <h1>用户名:"+log.getLname()+"</h1>\r\n"
+ " <h1>密码:"+log.getLpwd()+"</h1>\r\n"
+ " <h1>性别:"+log.getLsex()+"</h1>\r\n";
html+= "</body>\r\n"
+ "</html>";
out.print(html);
2、setCharacterEncoding (String charset )、设置响应的字符编码
response.setCharacterEncoding("utf-8");
3、response.setContentType("text/html;charset=utf-8");设置发送到客户端的响应的内容类型
response.setContentType("text/html;charset=utf-8");
4、sendRedirect(String location)、发送一个临时的重定向响应到客户端,以便客户端访问 新的URL;重定向;
response.sendRedirect("login.do");
通过观察浏览器我们发现第一次请求获得的响应码为 302,并且含有一个 location 头信息。并且地址 栏最终看到的地址是和第一次请求地址不同的,地址栏已经发生了变化。
重定向是一种客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会 进行响应,在响应的同时,服务器会给客户端一个新的地址(下次请求的地址 response.sendRedirect(url);),当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址 发起第二个请求,服务器接收请求并作出响应,重定向完成。
转发与重定向的区别
四、Cookie对象【会话技术】
使用场景:服务器无状态,不记录用户信息。把用户信息存储在浏览器上。
Cookie的创建:Cookie zhanghao = new Cookie("username",username);
// 让浏览器存储数据
response.addCookie(zhanghao);
// 获取cookie
Cookie[] cookies = request.getCookies();
五、session对象(session会话技术)
使用场景:浏览器与服务器一直在进行request、response交流,服务器无状态,不知道具体的请求,响应,于是我们把信息记录在session会话中 。
浏览器和服务器用session保持会话,只要会话不结束,都会有同一个session,在同一个会话中。
1、HttpSession getSession( )、返回和此次请求相关联的session,如果没有给客户端分配session, 则创建一个新的session
// 如果session对象存在,则获取;如果session对象不存在,则创建
HttpSession session = request.getSession();
2、setAttribute(String key, Object value)、以key/value的形式保存对象值
// 设置session域对象
session.setAttribute("uname","admin");
3、getAttribute(String key)、通过key获取对象值
// 获取指定名称的session域对象
String uname = (String) request.getAttribute("uname");
4、removeAttribute(String key)、从session中删除指定名称(key)所对 应的对象
// 移除指定名称的session域对象
session.removeAttribute("uname");
5、invalidate()、让session失效
// 销毁session对象
session.invalidate();
cookie和session的区别
六、ServletContext对象
ServletContext 对象,又称 Application 对象;在 WEB 容器启动的时候,会为每一个 WEB 应用程序创建一个对应的 ServletContext 对象。
// 获取ServletContext对象
ServletContext servletContext = request.getServletContext();
// 设置域对象
servletContext.setAttribute("name","zhangsan");
// 获取域对象
String name = (String) servletContext.getAttribute("name");
// 移除域对象
servletContext.removeAttribute("name")