基础

1 实现交互

1.1 创建web端

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Content-Type" content="text/html; charset = UTF-8">
  6. <title>登录页面</title>
  7. </head>
  8. <body>
  9. <form action="login" method="post">
  10. 账号: <input type="text" name="name"> <br>
  11. 密码: <input type="password" name="password"> <br>
  12. <input type="submit" value="登录">
  13. </form>
  14. <form action="login" method="get">
  15. 账号: <input type="text" name="name"> <br>
  16. 密码: <input type="password" name="password"> <br>
  17. <input type="submit" value="登录">
  18. </form>
  19. </body>
  20. </html>

1.2 创建自定义servlet

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class LoginServlet extends HttpServlet {
  8. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. String name = request.getParameter("name");
  11. String password = request.getParameter("password");
  12. String html = "";
  13. // 转换成中文字符
  14. byte[] bytes = name.getBytes("ISO-8859-1");
  15. System.out.println(new String(bytes, "UTF-8"));
  16. request.setCharacterEncoding("UTF-8");
  17. response.setContentType("text/html;charset=UTF-8");
  18. if (name.equals("1") && password.equals("1")) {
  19. html = "<div style='color:green'>成功</div>";
  20. } else {
  21. html = "<div style='color:red'>失败</div>";
  22. }
  23. PrintWriter pw = response.getWriter();
  24. pw.println(html);
  25. }
  26. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  27. throws ServletException, IOException {
  28. String name = request.getParameter("name");
  29. String password = request.getParameter("password");
  30. String html = "";
  31. if (name.equals("2") && password.equals("2")) {
  32. //服务端跳转
  33. request.getRequestDispatcher("success.html").forward(request, response);
  34. // html = "<div style='color:green'>success</div>";
  35. } else {
  36. // 客户端跳转
  37. response.sendRedirect("fail.html");
  38. // html = "<div style='color:red'>fail</div>";
  39. }
  40. // PrintWriter pw = response.getWriter();
  41. // pw.println(html);
  42. }
  43. }

1.3 配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>Test</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12. <servlet>
  13. <servlet-name>LoginServlet</servlet-name>
  14. <servlet-class>LoginServlet</servlet-class>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>LoginServlet</servlet-name>
  18. <url-pattern>/login</url-pattern>
  19. </servlet-mapping>
  20. </web-app>

2 重要参数

2.1 HttpServletRequest request

HttpServletRequest request代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

2.2 HttpServletResponse response

HttpServletResponse response代表响应对象,用于向客户端发送数据。

3 调用流程

Servlet - 图1

4 三个主要方法

4.1 doGet()

当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法。

  1. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. }

4.2 doPost()

当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法。

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. }

4.3 service()

在执行doPost和doGet之前,会执行service()。由service判断执行doPost还是doGet。

5 中文问题

5.1 获取中文参数

  1. // 单个转换
  2. byte[] bytes = name.getBytes("ISO-8859-1");
  3. System.out.println(new String(bytes, "UTF-8"));
  4. // 批量转换
  5. request.setCharacterEncoding("UTF-8");

5.2 返回中文响应

  1. response.setContentType("text/html;charset=UTF-8");

6 跳转

6.1 服务端跳转

  1. request.getRequestDispatcher("success.html").forward(request, response);

注意url
图片.png

6.2 客户端跳转

  1. response.sendRedirect("fail.html");

注意url
图片.png

7 request方法

7.1 常见方法

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. System.out.println(request.getRequestURL().toString()); // 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)
  4. System.out.println(request.getRequestURI()); // 浏览器发出请求的资源名部分,去掉了协议和主机名
  5. System.out.println(request.getQueryString()); // 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
  6. System.out.println(request.getMethod()); // 得到客户机请求方式一般是GET或者POST
  7. System.out.println(request.getPathInfo()); // 返回请求的实际URL相对于请求的serlvet的url的路径
  8. System.out.println(request.getLocalAddr()); // 服务器的IP地址
  9. System.out.println(request.getLocalName()); // 服务器的主机名
  10. System.out.println(request.getRemoteAddr()); // 浏览器所处于的客户机的IP地址
  11. System.out.println(request.getRemoteHost()); // 获取服务端地址
  12. System.out.println(request.getRemoteUser()); // 获取当前缓存的用户,比如Spring Security做权限控制后就会将用户登录名缓存到这里
  13. System.out.println(request.getRemotePort()); // 浏览器所处于的客户机使用的网络端口
  14. }

image.png

7.2 获取参数

request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 “hobits”,可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。

7.3 获取头信息

request.getHeader() 获取浏览器传递过来的头信息。
比如getHeader(“user-agent”) 可以获取浏览器的基本资料,这样就能判断是firefox、IE、chrome、或者是safari浏览器
request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息

host: 主机地址
user-agent: 浏览器基本资料
accept: 表示浏览器接受的数据类型
accept-language: 表示浏览器接受的语言
accept-encoding: 表示浏览器接受的压缩方式,是压缩方式,并非编码
connection: 是否保持连接
cache-control: 缓存时限

  1. Enumeration<String> headerNames= request.getHeaderNames();
  2. while(headerNames.hasMoreElements()){
  3. String header = headerNames.nextElement();
  4. String value = request.getHeader(header);
  5. System.out.printf("%s\t%s%n",header,value);
  6. }

image.png

7.4 服务端传参

setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享

8 response方法

8.1 设置响应内容

PrintWriter pw= response.getWriter();


通过response.getWriter(); 获取一个PrintWriter 对象
可以使用println(),append(),write(),format()等等方法设置返回给浏览器的html内容。

8.2 设置响应格式

response.setContentType(“text/html”);

“text/html” 是即格式 ,在request获取头信息 中对应的request.getHeader(“accept”).
“text/html” 是存在的,表示浏览器可以识别这种格式,如果换一个其他的格式, 比如 “text/lol” ,浏览器不能识别,那么打开此servlet就会弹出一个下载的对话框。
image.png

8.3 设置响应编码

response.setContentType(“text/html; charset=UTF-8”);

不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文

response.setCharacterEncoding(“UTF-8”);

仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动再进行一次设置。

8.4 客户端跳转

8.4.1 302跳转(临时跳转)

response.sendRedirect(“fail.html”);

8.4.2 301跳转(永久性跳转)

response.setStatus(301);
注:设置完status之后,不能再写入字符串。再写返回json,前台会接收不到。
response.setHeader(“Location”, “fail.html”);

8.5 设置不使用缓存

使用缓存可以加快页面的加载,降低服务端的负担。但是也可能看到过时的信息,可以通过如下手段通知浏览器不要使用缓存:
response.setDateHeader(“Expires”,0 );
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“pragma”,”no-cache”);

9 上传文件