Servlet:任何实现了Servlet接口的类,是用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Servlet容器:例如Tomcat服务器
1、Servlet工作原理
1. Servlet容器将Servlet类载入内存,并产生Servlet实例和调用其具体的方法。在一个应用程序中,每种Servlet类型只能有一个实例。
2. 用户请求致使Servlet容器调用Servlet的Service方法,并传入一个ServletRequest对象和ServletResponse对象;这两个对象都是由Servlet容器封装好的。
3. 对于每一个应用程序,Servlet容器会创建唯一的一个ServletContext对象,封装了应用程序的环境详情。每个Servlet对象有一个封装Servlet配置的ServletConfig对象。
ServletContext和ServletConfig 详情请参考
2、Servlet的生命周期
客户端首次请求:
1. Servlet容器解析请求,根据请求找到对应的Servlet,判断Servlet实例是否存在,不存在则创建;
2. 调取init方法进行初始化操作;
3. 初始化完成后调取service方法,由service方法判断客户端请求方式,get请求执行doGet(),post请求执行doPost(),处理完成后,将结果返回给客户端。单次请求完成。
客户端第二次请求:
1. 判断对象是否存在,但是不再执行init(),而直接执行service方法,调取doGet()/doPost()方法。
服务器关闭时调取destroy()方法进行销毁。
3、HttpServletRequest
HttpServletRequest表示Http环境中的Servlet请求。
常用方法:
1. String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String
注:服务器在接收数据时使用字符串统一接收
2. String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
3. void setCharacterEncoding(String charset) 指定每个请求的编码(针对post请求才起作用)
4. RequestDispatcher getRequestDispatcher(String path) --跳转页面,返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求
request.getRequestDispatcher("../success.jsp").forward(request,response);
5. 存值 request.setAttribute("key",value);
6. 取值 request.getAttribute("key");//取值后需要向下转型,不能用于获取表单提交的数据。
String a1=(String)request.getAttribute("uname");
补充:
1. 处理请求乱码的问题:setCharacterEncoding("UTF-8");//post提交时管用
2. 客户端发送数据给服务器:
1)通过表单get/post提交;
2)通过a标签发送数据(get提交);
3)通过地址栏直接拼接get请求;
4)js提交数据(get请求)
location.href="目标请求?key=value&key=value"
3. get和post的区别:
1)get请求的数据会暴露在地址栏中,post请求不会;
2)get请求传输数据会受到url长度限制,post请求不会;
3)post的安全性比get高,get请求提交数据时可能会造成CSRF(跨站请求伪造)攻击。
4、HttpServletResponse
HttpServletResponse用来封装HTTP响应消息。 在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。
常用方法:
1. void addCookie(Cookie var1);//给这个响应添加一个cookie
2. void sendRedirect(String var1) ;//发送一条响应码,将浏览器跳转到指定的位置
3. PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
4. setContentType() 设置响应内容的类型
5、重定向和转发
重定向:response.sendRedirect();
地址栏会改变,request中存储的数据会丢失;
两次请求,两次响应(地址栏修改了两次)
转发:request.getRequestDispatcher("../success.jsp").forward(request,response);
地址栏不会改变,request中存储的数据不会丢失;
一次请求,一次响应;
注意:
使用js跳转页面也会丢失request中的数据。
6、session
request存的值只能在单次请求中保存,保存的数据不能跨页面,当重定向时,request存的值会丢失;
session的数据可以在多个页面中共享,即使重定向页面,数据不会丢失;
session中可以包含n个request。
会话的概念:从打开浏览器到关闭浏览器,期间访问服务器就称为一次会话。
常用方法:
1. void setAttribute(String key,Object value) 以key/value的形式保存对象值,将数据存储在服务器端
2. Object getAttribute(String key) 通过key获取对象值
3. void invalidate() 设置session对象失效
4. String getId() 获取sessionid,当第一次登录成功后,session会产生一个唯一的id,浏览器之后访问时如果发现id值还是之前id,那么说明 当前访问的属于同一个会话
5. void setMaxInactiveInterval(int interval) 设定session的非活动时间
方式1: session.setMaxInactiveInterval(10*60);//设置有效时间为10分钟
方式2:修改web.xml
<session-config>
<session-timeout>10</session-timeout>//单位:分钟
</session-config>
6. int getMaxInactiveInterval() 获取session的有效非活动时间(以秒为单位),默认的有效时间:30分钟
7. void removeAttribute(String key) 从session中删除指定名称(key)所对应的对象