1)Servlet 生命周期
- Servlet 是第一次访问才会调用 init () 方法进行初始化,由服务器创建。
- Servlet 调用 service()方法来处理客户端的请求,doGet()、doPost()只是它的一个事件派发。
- Servlet 通过调用 destroy() 方法终止(结束)或者项目移除。
2)Servlet在web.xml里的配置
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>web.back.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
3)使用 Servlet 读取表单数据
- getParameter():可以调用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues():一个name对应多个值,例如复选框。
- getParameterMap():返回map集合。
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
ConvertUtils.register(new DateLocaleConverter(), Date.class);
BeanUtils.populate(user, parameterMap);
4)两种请求方式get 、post
- GET 方法是默认的从浏览器向 Web服务器传递信息的方法,它会产生一个很长的字符串,携带表单提交的信息,出现在浏览器的地址栏中。如果您要向服务器传递的是密码或其他的敏感信息,请不要使用 GET方法。GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
- POST方法则不会携带表单提交的信息出现在浏览器的地址栏中,因此不会有大小限制问题。
5)get 、post乱码问题
请求正文get:
String username = req.getParameter("username"); byte[] bytes = username.getBytes("iso-8859-1"); String str = new String(bytes, "UTF-8");
请求体post :
request.setCharacterEncoding("utf-8");
response:
response.setContentType("text/html; charset=UTF-8");
6)Servlet 服务器 HTTP 请求 HttpServletRequest 对象
- Cookie[] getCookies()
- HttpSession getSession()
- Enumeration getParameterNames()
- Enumeration getAttributeNames()
- Object getAttribute(String name)
- String getParameter(String name)
- String[] getParameterValues(String name)
- int getParameterMap()
- String getContentType(),返回请求主体的 MIME 类型
- String getContextPath(),得到项目名
- String getServletPath(),得到项目的路径
- request.getRequestDispatcher(“/WEBINF/jsp/back/login.jsp”).forward(request,response);
7)Servlet 服务器 HTTP 响应 HttpServletResponse 对象
当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行、一些响应报头、一个响应空行和响应体。
- void addCookie(Cookie cookie)
- void sendRedirect(String location)
8)Servlet HTTP 状态码
状态码 | 描述 |
---|---|
100 | 只有请求的一部分已经被服务器接收 |
200 | 请求成功 |
302 | 重定向 |
304 | 没有doget或dopost |
404 | 找不到 |
500 | 后台代码问题 |
9)Servlet 编写过滤器 Filter
filter与servlet是表兄弟,很类似,除了init的调用时间和优先级问题。
Filter的执行顺序与在web.xml配置文件中的配置顺序一致(并不是靠优先级),一般把Filter配置在所有的Servlet之前。
过滤器是列表内容一个实现了 javax.servlet.Filter 接口的 Java 类。
- public void init(FilterConfig filterConfig),web 应用程序启动时,web 服务器将创建Filter 的实例对象,并立即调用其init方法,而servlet是第一次访问时才调用init方法。filter对象只会创建一次,init方法也只会执行一次。
- public void doFilter (ServletRequest, ServletResponse, FilterChain)
- public void destroy(),释放Servlet过滤器占用的资源
10)Filter在xml里面的配置
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.runoob.test.LogFilter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>com.web.back.filter.LogFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
11)定义自己的异常处理界面
<error-page>
<error-code>404</error-code>
<location>/TomcatTest/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
12)客户端的会话技术cookie
- cookie不能存储对象,存储中文会乱码,一般是存储字符串。
- public void setMaxAge(int expiry),该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
- public String getValue(),该方法获取与 cookie 关联的值。
设置cookie
Cookie cookie = new Cookie("key","value"); cookie.setMaxAge(60*60*24); response.addCookie(cookie);
读取 Cookie
Cookie[] cookies = null; cookies = request.getCookies(); if( cookies != null ){ for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("url") == 0 ){ //删除cookie cookie.setMaxAge(0); response.addCookie(cookie); } out.print("名称:" + cookie.getName( ) + ","); out.print("值:" + cookie.getValue( )+" <br/>"); } }
13)服务端的会话技术session
HTTP 是一种无状态协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:
- Cookies,但是很多浏览器不支持 cookie,所以我们建议不要使用这种方式来维持 session 会话。
隐藏的表单字段,但是点击常规的超文本链接不会导致表单提交
<input type="hidden" name="sessionid" value="12345">
URL 重写,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。
所以我们的HttpSession 对象就产生了;Servlet 容器使用 HttpSession接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
HttpSession session = request.getSession();
HttpSession 对象(能存储对象)中可用的几个重要的方法:
- public Object getAttribute(String name),该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
- public void invalidate(),该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
- public void removeAttribute(String name),该方法将从该 session 会话移除指定名称的对象。
- public void setAttribute(String name, Object value) ,该方法使用指定的名称绑定一个对象到该 session 会话。
- public void setMaxInactiveInterval(int interval),该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。
- public long getCreationTime(),该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。主要用来获取网页的最后一次访问时间。
- public boolean isNew(),主要来获取是否有新用户。
14)表单文件上传
三个注意点:
- 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。
- 表单 enctype 属性应该设置为 multipart/form-data.
- 上传单个文件,应该使用单个带有属性 type=”file” 的input标签。
if (!ServletFileUpload.isMultipartContent(request)) {
// 如果不是则停止
PrintWriter writer = response.getWriter();
writer.println("Error: 表单必须包含 enctype=multipart/form-data");
writer.flush();
return;
}
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
try {
List<FileItem> parseRequest = servletFileUpload.parseRequest(request);
for (FileItem fileItem : parseRequest) {
boolean formField = fileItem.isFormField();
System.out.println("~~~~~");
if (formField) {
String fieldName = fileItem.getFieldName();
String string = fileItem.getString("utf-8");
}else{
InputStream is = fileItem.getInputStream();
String name = fileItem.getName();
String realFileName = FileName.getRealFileName(name);
FileOutputStream os = new FileOutputStream( GlobalParameter.fileUpload_fileUpload_path + realFileName);
IOUtils.copy(is, os);
}
}