• JavaWeb-Servlet


    目录

    1、HelloServlet

    2、Servlet原理

    3、Mapping 问题

    4、ServletContext

    5、Response下载文件

    6、Response验证码功能 

    7、Response重定向 

    8、HttpServletRequest


    Servlet 就是 Sun 公司开发动态 Web 的一门技术

    Sun 在这些 API (Application Programming Interface,应用程序接口)中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

    编写一个类,实现Servlet接口。
    把开发好的Java类部署到web服务器中。
    把实现了 Servlet 接口的 Java 程序叫做,Servlet

    1、HelloServlet

    1)Serlvet 接口 Sun 公司有两个默认的实现类:HttpServlet,GenericServlet

    构建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Moudel;这个空的工程就是Maven主工程(建一个WebApp Maven项目,勾选模板);

    2)关于Maven父子工程的理解:

    父项目中会有:

    1. <modules>
    2. <module>lesson01module>
    3. <module>lesson01module>
    4. modules>

    子项目中会有:

    1. <parent>
    2. <artifactId>JavaWeb_studyartifactId>
    3. <groupId>org.examplegroupId>
    4. <version>1.0-SNAPSHOTversion>
    5. parent>

    父项目中的 Java 子项目可以直接使用

     son extends father

    3)Maven 环境优化

    • 修改 web.xml 为最新的

    • 将 maven 的结构搭建完整

    4)编写一个servlet程序

    S1:编写一个普通类
    S2:实现 Servlet 接口,这里我们直接继承 HttpServlet

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. import java.io.PrintWriter;
    7. public class HelloServlet extends HttpServlet {
    8. //由于get和post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
    9. @Override
    10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. PrintWriter writer=resp.getWriter();//响应流
    12. writer.print("hello,servlet");
    13. }
    14. @Override
    15. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. doGet(req, resp);
    17. }
    18. }

    5)编写servlet的映射

    为什么需要映射:我们写的是 Java 程序,但是要通过浏览器访问,而浏览器需要连接 Web 服务器,所以我们需要再 Web 服务中注册我们写的 Servlet,还需给他一个浏览器能够访问的路径;

    6)配置 Tomcat
    点击编辑,+ 号,选择本地的 Tomcat

    7)启动测试!

    2、Servlet原理

    Servlet 是由 Web 服务器调用,Web 服务器在收到浏览器请求之后,会:

    3、Mapping 问题

    1)一个 Servlet 可以指定一个映射路径

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>/hellourl-pattern>
    4. servlet-mapping>

    2)一个 Servlet 可以指定多个映射路径

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>/hellourl-pattern>
    4. servlet-mapping>
    5. <servlet-mapping>
    6. <servlet-name>helloservlet-name>
    7. <url-pattern>/hello2url-pattern>
    8. servlet-mapping>
    9. <servlet-mapping>
    10. <servlet-name>helloservlet-name>
    11. <url-pattern>/hello3url-pattern>
    12. servlet-mapping>
    13. <servlet-mapping>
    14. <servlet-name>helloservlet-name>
    15. <url-pattern>/hello4url-pattern>
    16. servlet-mapping>

    3)一个 Servlet 可以指定通用映射路径

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>/hello/*url-pattern>
    4. servlet-mapping>

    4)默认请求路径

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>/*url-pattern>
    4. servlet-mapping>

    5)指定一些后缀或者前缀等等

    可以自定义后缀实现请求映射

    注意:‘*’ 前面不能加映射的路径

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>*.biuurl-pattern>
    4. servlet-mapping>

    6)优先级问题

    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. import java.io.PrintWriter;
    7. public class ErrorServlet extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. resp.setContentType("text/html");
    11. resp.setCharacterEncoding("utf-8");
    12. PrintWriter writer = resp.getWriter();
    13. writer.print("

      404

      "
      );
    14. }
    15. @Override
    16. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. super.doPost(req, resp);
    18. }
    19. }

    配置文件:

    1. <servlet>
    2. <servlet-name>errorservlet-name>
    3. <servlet-class>com.lwy.servlet.ErrorServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>errorservlet-name>
    7. <url-pattern>/*url-pattern>
    8. servlet-mapping>

    4、ServletContext

    Web 容器在启动的时候,它会为每个 Web 程序都创建一个对应的 ServletContext 对象,它代表了当前的 Web 应用;

    共享数据

    在一个 servlet 中保存的数据,可以在另一个 servlet 中拿到; 

    放置数据的类:

    1. import javax.servlet.ServletContext;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. public class HelloServlet extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. // this.getInitParameter() 初始化参数
    11. // this.getServletConfig() servlet配置
    12. // this.getServletContext() servlet上下文
    13. ServletContext servletContext = this.getServletContext();
    14. String username="biubiu";//数据
    15. servletContext.setAttribute("username",username);//将一个数据保存在了servletContext中 (键值对形式)
    16. System.out.println("hello");
    17. }
    18. }

    获取数据的类:

    1. import javax.servlet.ServletContext;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. public class GetServlet extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. ServletContext servletContext = this.getServletContext();
    11. String username =(String) servletContext.getAttribute("username");
    12. resp.setContentType("text/html");
    13. resp.setCharacterEncoding("utf-8");
    14. resp.getWriter().print("名字:"+username);
    15. }
    16. @Override
    17. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18. super.doPost(req, resp);
    19. }
    20. }

    配置servlet:

    1. web-app PUBLIC
    2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4. <web-app>
    5. <display-name>Archetype Created Web Applicationdisplay-name>
    6. <servlet>
    7. <servlet-name>helloservlet-name>
    8. <servlet-class>com.lwy.servlet.HelloServletservlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>helloservlet-name>
    12. <url-pattern>/hellourl-pattern>
    13. servlet-mapping>
    14. <servlet>
    15. <servlet-name>getcservlet-name>
    16. <servlet-class>com.lwy.servlet.GetServletservlet-class>
    17. servlet>
    18. <servlet-mapping>
    19. <servlet-name>getcservlet-name>
    20. <url-pattern>/getcurl-pattern>
    21. servlet-mapping>
    22. web-app>

    测试访问结果:

     获取初始化参数

    1. import javax.servlet.ServletContext;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. public class ServletDemo03 extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. //上下文
    11. ServletContext servletContext = this.getServletContext();
    12. String url = servletContext.getInitParameter("url");
    13. resp.getWriter().print(url);
    14. }
    15. @Override
    16. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. super.doPost(req, resp);
    18. }
    19. }

    配置文件:

    1. gp
    2. com.lwy.servlet.ServletDemo03
    3. gp
    4. /gp

    请求转发

    1. import javax.servlet.ServletContext;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. public class ServletDemo04 extends HttpServlet {
    8. protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
    9. //获取上下文
    10. ServletContext servletContext = this.getServletContext();
    11. //调用forward方法实现请求转发
    12. servletContext.getRequestDispatcher("/gp").forward(req,resp);
    13. }
    14. protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    15. doGet(req, resp);
    16. }
    17. }

    读取资源文件

    Properties

    • 在 java 目录下新建 properties
    • 在 resources 目录下新建 properties

    发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:

    思路:需要一个文件流;

    资源文件中存放的信息(db.properties):

    1. username=root
    2. password=root
    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.util.Properties;
    8. public class ServletDemo05 extends HttpServlet {
    9. @Override
    10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
    12. Properties prop = new Properties();
    13. prop.load(is);
    14. String user = prop.getProperty("username");
    15. String pwd = prop.getProperty("password");
    16. resp.getWriter().print(user+":"+pwd);
    17. }
    18. @Override
    19. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    20. super.doPost(req, resp);
    21. }
    22. }

     映射路径:

    1. <servlet>
    2. <servlet-name>s5servlet-name>
    3. <servlet-class>com.lwy.servlet.ServletDemo05servlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>s5servlet-name>
    7. <url-pattern>/s5url-pattern>
    8. servlet-mapping>

    5、Response下载文件

    Web 服务器接收到客户端的 http 请求,针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,代表响应的一个 HttpServletResponse;

    • 如果想要获取客户端请求过来的参数:找 HttpServletRequest
    • 如果要给客户端响应一些信息:找 HttpServletResponse

    简单分类

    负责向浏览器发送数据的方法

    1. ServletOutputStream getOutputStream() throws IOException;
    2. PrintWriter getWriter() throws IOException;

    负责向浏览器发送响应头的方法 

    1. void setCharacterEncoding(String var1);
    2. void setContentLength(int var1);
    3. void setContentLengthLong(long var1);
    4. void setContentType(String var1);
    5. void setDateHeader(String var1, long var2);
    6. void addDateHeader(String var1, long var2);
    7. void setHeader(String var1, String var2);
    8. void addHeader(String var1, String var2);
    9. void setIntHeader(String var1, int var2);
    10. void addIntHeader(String var1, int var2);

    响应的状态码

    1. int SC_CONTINUE = 100;
    2. int SC_SWITCHING_PROTOCOLS = 101;
    3. int SC_OK = 200;
    4. int SC_CREATED = 201;
    5. int SC_ACCEPTED = 202;
    6. int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    7. int SC_NO_CONTENT = 204;
    8. int SC_RESET_CONTENT = 205;
    9. int SC_PARTIAL_CONTENT = 206;
    10. int SC_MULTIPLE_CHOICES = 300;
    11. int SC_MOVED_PERMANENTLY = 301;
    12. int SC_MOVED_TEMPORARILY = 302;
    13. int SC_FOUND = 302;
    14. int SC_SEE_OTHER = 303;
    15. int SC_NOT_MODIFIED = 304;
    16. int SC_USE_PROXY = 305;
    17. int SC_TEMPORARY_REDIRECT = 307;
    18. int SC_BAD_REQUEST = 400;
    19. int SC_UNAUTHORIZED = 401;
    20. int SC_PAYMENT_REQUIRED = 402;
    21. int SC_FORBIDDEN = 403;
    22. int SC_NOT_FOUND = 404;
    23. int SC_METHOD_NOT_ALLOWED = 405;
    24. int SC_NOT_ACCEPTABLE = 406;
    25. int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    26. int SC_REQUEST_TIMEOUT = 408;
    27. int SC_CONFLICT = 409;
    28. int SC_GONE = 410;
    29. int SC_LENGTH_REQUIRED = 411;
    30. int SC_PRECONDITION_FAILED = 412;
    31. int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    32. int SC_REQUEST_URI_TOO_LONG = 414;
    33. int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    34. int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    35. int SC_EXPECTATION_FAILED = 417;
    36. int SC_INTERNAL_SERVER_ERROR = 500;
    37. int SC_NOT_IMPLEMENTED = 501;
    38. int SC_BAD_GATEWAY = 502;
    39. int SC_SERVICE_UNAVAILABLE = 503;
    40. int SC_GATEWAY_TIMEOUT = 504;
    41. int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

    常见应用

    1)向浏览器输出信息

    2)下载文件

    • 要获取下载文件的路径
    • 下载的文件名是什么
    • 设置,想办法让浏览器能够支持下载我们需要的东西
    • 获取下载文件的输入流
    • 创建缓冲区
    • 获取OutputStream对象
    • 将FileOutputStream流写入到缓冲区
    • 使用OutputStream将缓冲区的数据输出到客户端

    演示:使用response实现文件的下载

    1. import javax.servlet.ServletException;
    2. import javax.servlet.ServletOutputStream;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.FileInputStream;
    7. import java.io.IOException;
    8. import java.net.URLEncoder;
    9. public class FileServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. // 1.要获取下载文件的路径
    13. String realPath = "D:\\Java\\JavaWeb_study\\lesson03\\src\\main\\resources\\1.PNG";
    14. System.out.println("下载的文件的路径:"+realPath);
    15. // 2.下载的文件名是什么
    16. String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    17. // 3.设置,想办法让浏览器能够支持下载我们需要的东西,中文文件名使用URLEncoder.encode(fileName,"utf-8")编码
    18. resp.setHeader("Content-Disposition","attachment;filename="+fileName+ URLEncoder.encode(fileName,"utf-8"));
    19. // 4.获取下载文件的输入流
    20. FileInputStream in = new FileInputStream(realPath);
    21. // 5.创建缓冲区
    22. int len=0;
    23. byte[] buffer = new byte[1024];//缓冲区
    24. // 6.获取OutputStream对象
    25. ServletOutputStream out = resp.getOutputStream();
    26. // 7.将FileOutputStream流写入到缓冲区
    27. // 8.使用OutputStream将缓冲区的数据输出到客户端
    28. while((len=in.read(buffer))>0){
    29. out.write(buffer,0,len);
    30. }
    31. // 关闭流
    32. in.close();
    33. out.close();
    34. }
    35. @Override
    36. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    37. super.doPost(req, resp);
    38. }
    39. }

    路径映射:

    1. <servlet>
    2. <servlet-name>filedownservlet-name>
    3. <servlet-class>com.lwy.servlet.FileServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>filedownservlet-name>
    7. <url-pattern>/downurl-pattern>
    8. servlet-mapping>

    网页中的效果: 

    6、Response验证码功能 

    验证码怎么来的?

    • 前端实现
    • 后端实现:需要用到java的图片类,生产一个图片
    1. import javax.imageio.ImageIO;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.awt.*;
    7. import java.awt.image.BufferedImage;
    8. import java.io.IOException;
    9. import java.util.Random;
    10. public class ImageServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. //如何让浏览器3秒自动刷新一次
    14. resp.setHeader("refresh","3");
    15. //在内存中创建图片
    16. BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
    17. //得到图片
    18. Graphics2D graphics = (Graphics2D)bufferedImage.getGraphics();//画笔
    19. //设置图片的背景颜色
    20. graphics.setColor(Color.WHITE);//画背景
    21. graphics.fillRect(0,0,80,20);
    22. //给图片写数据
    23. graphics.setColor(Color.BLUE);//写东西
    24. graphics.setFont(new Font(null,Font.BOLD,20));
    25. graphics.drawString(makeNum(),0,20);
    26. //告诉浏览器这个请求用图片的方式打开
    27. resp.setContentType("image/PNG");
    28. //网站存在缓冲,需要解决
    29. resp.setDateHeader("expires",-1);
    30. resp.setHeader("Cache-Control","no-cache");
    31. resp.setHeader("Pragma","no-cache");
    32. //把图片写给浏览器
    33. ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
    34. }
    35. //生成随机数
    36. public String makeNum(){
    37. Random random = new Random();
    38. String num=random.nextInt(9999999)+"";
    39. StringBuffer stringBuffer = new StringBuffer();
    40. for(int i=0;i<7-num.length();i++){
    41. stringBuffer.append(0);
    42. }
    43. String s=stringBuffer.toString() + num;
    44. return num;
    45. }
    46. @Override
    47. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    48. doGet(req, resp);
    49. }
    50. }

    映射路径:

    1. <servlet>
    2. <servlet-name>ImageServletservlet-name>
    3. <servlet-class>com.lwy.servlet.ImageServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>ImageServletservlet-name>
    7. <url-pattern>/imgurl-pattern>
    8. servlet-mapping>

     页面效果(页面每3秒中自动刷新一次):

    7、Response重定向 

    Web 资源 B 收到客户端 A 请求后,通知 A 访问另一个 Web 资源 C ,这个过程叫做重定向

    常见场景:

    • 用户登录
    void sendRedirect(String var1) throws IOException;
    

     测试重定向:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. public class RedirectServlet extends HttpServlet {
    7. @Override
    8. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    9. resp.sendRedirect("/lesson03/img");
    10. }
    11. @Override
    12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. super.doPost(req, resp);
    14. }
    15. }

    映射路径:

    1. <servlet>
    2. <servlet-name>RedirectServletservlet-name>
    3. <servlet-class>com.lwy.servlet.RedirectServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>RedirectServletservlet-name>
    7. <url-pattern>/redurl-pattern>
    8. servlet-mapping>

    面试题:

    重定向和转发的区别 

    相同点:

    • 页面都会实现跳转

    不同点: 

    • 请求转发的时候,URL 不会发生变化
    • 重定向时候,URL 地址栏会发生变化;

    原理图:

    简单实现登录重定向(模拟用户登录):

    前端页面:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%--这里提交的路径,需要寻找到项目的路径--%>
    3. <%--pageContext.request.contextPath :表示当前项目--%>
    4. "login" method="get">
    5. 用户名:"text" name="username">
    6. 密码:"password" name="password">
    7. "submit">

     Java代码:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. public class RequestTest extends HttpServlet {
    7. @Override
    8. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    9. //处理请求
    10. String username = req.getParameter("username");
    11. String password = req.getParameter("password");
    12. System.out.println(username+":"+password);
    13. resp.sendRedirect("/lesson03/success.jsp");
    14. }
    15. @Override
    16. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. doGet(req, resp);
    18. }
    19. }

    路径映射:

    1. <servlet>
    2. <servlet-name>requestservlet-name>
    3. <servlet-class>com.lwy.servlet.RequestTestservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>requestservlet-name>
    7. <url-pattern>/loginurl-pattern>
    8. servlet-mapping>

    跳转页面:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. Success

    8、HttpServletRequest

    代表客户端的请求,用户通过HTTP协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest的方法,获得客户端的所有信息

    可以获取前端传递的参数

    测试代码:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. import java.util.Arrays;
    7. public class LoginServlet extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. req.setCharacterEncoding("utf-8");
    11. resp.setCharacterEncoding("utf-8");
    12. String username = req.getParameter("username");
    13. String password = req.getParameter("password");
    14. String[] hobbys = req.getParameterValues("hobbys");
    15. System.out.println("==================================");
    16. //后台接收中文乱码问题
    17. System.out.println(username);
    18. System.out.println(password);
    19. System.out.println(Arrays.toString(hobbys));
    20. System.out.println("==================================");
    21. //通过请求转发
    22. req.getRequestDispatcher("success.jsp").forward(req,resp);
    23. }
    24. @Override
    25. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    26. doGet(req, resp);
    27. }
    28. }

    前端页面:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>登录title>
    5. head>
    6. <body>
    7. <h1>登录h1>
    8. <div style="text-align: center">
    9. <form action="login" method="post">
    10. 用户名:<input type="text" name="username"><br>
    11. 密码:<input type="password" name="password"><br>
    12. 爱好:
    13. <input type="checkbox" name="hobbys" value="音乐">音乐
    14. <input type="checkbox" name="hobbys" value="代码">代码
    15. <input type="checkbox" name="hobbys" value="电影">电影
    16. <input type="checkbox" name="hobbys" value="唱歌">唱歌
    17. <br>
    18. <input type="submit">
    19. form>
    20. div>
    21. body>
    22. html>

    跳转页面:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <h1>登录成功h1>
    8. body>
    9. html>

    控制台打印输出:

  • 相关阅读:
    Fast DDS之Subscriber
    基于 Vue 实现页面中文本的复制功能
    计算机组成原理_1
    Vue实现未登录跳转到登录页
    c++实现串口功能之termios.h头文件研读<一>
    剑指 Offer 24. 反转链表
    jpg格式图片怎么弄?不同格式图片该怎么转换?
    重置Jetson设备的Ubuntu密码:通过挂载根目录到另一个Linux系统
    代码随想录算法公开课!
    从零开始做一个SDWAN
  • 原文地址:https://blog.csdn.net/qq_61727355/article/details/126727114