Servlet基础

1.Servlet简介

Servlet = Server + let 服务器小应用程序

本质是一个Java类,该Servlet类的实例实现由tomcat容器负责创建并管理
Servlet类似生活中餐厅的服务员

  • Servlet的定义:

Servlet是一个Java程序,是驻留在服务器端,运行以处理客户端请求并做出响应的程序

  • 创建Servlet类,必须满足以下两个条件
(1) 定义类,继承JavaEE --> javax.servlet.http.HttpServlet类 [抽象类]
(2) 重定父类HttpServlet中的两个方法: doGet(),doPost()
             |-关注这两个方法的参数:
                      HttpServletRequest  request -封装客户端请求信息的对象
                      HttpServletResponse response -封装响应输出对象
  • Servlet作用

其功能就是动态地生成网页,接收用户发送的请求和数据,然后根据这些请求和数据访问数据库等其它应用程序,最后将产生的结果以HTML格式的页面返回给客户端

  • 创建自定义Servlet类
    maven项目需要添加servlet与jsp的api依赖
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>

HelloServlet类:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doGet()....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doPost()....");
    }
}

2.Servlet配置与运行

如果前台浏览端需要访问 java web应用中的后台Servlet程序,则必须先配置Servlet的映射名称类似,在医院挂号

  • 配置Servlet有两种方式
    方式一:使用web.xml
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <!--反射机制,动态加载该类实例-->
    <servlet-class>com.woniu.servlet.HelloServlet</servlet-class>
  </servlet>

  <!--Servlet映射-->
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <!--指定在浏览器地址栏请求地址描述-->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

方式二:注解方式

@WebServlet({"/hello","/aaa","/bbb"})
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doGet()....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doPost()....");
    }
}

注:如果启动Tomcat报错:
Invalid <url-pattern> [hello] in servlet mapping

都是由于url-pattern掉了/,必须以/开头

Servlet接收请求参数

演示以超链接和表单分别发送请求参数

  • 超链接
<body>
这是a.jsp<hr>
<a href="hello?name=jack&age=20">请求Servlet</a><br>

<form action="hello">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交" />
</form>
</body>
  • 表单
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doGet()....");
        //接收请求参数
        String name = request.getParameter("name"); //如果拿不到,则为null
        int age = Integer.parseInt(request.getParameter("age"));

        System.out.println("收到了客户端的请求参数:"+name+","+age);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doPost()....");
    }
}

4.Servlet输出响应信息(有两处问题)

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doGet()....");
        //接收请求参数
        String name = request.getParameter("name"); //如果拿不到,则为null
        int age = Integer.parseInt(request.getParameter("age"));

        System.out.println("收到了客户端的请求参数:"+name+","+age);

        //向客户端浏览器输出消息
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>A Servlet</title></head>");
        out.println("<body>");
        out.println("Hello,"+name+","+age);
        out.println("</body>");
        out.println("</html>");
        //释放资源
        out.flush();
        out.close();
    }

  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求到达HelloServlet中的doPost()....");
        this.doGet(req,resp); //调用doGet()
    }

问题1: Servlet 接收请求参数
如果是Get方式,中文不是乱码[由Tomcat版本决定],但如果post方式,则是乱码
问题2: Servlet 使用response.getWritter()输出中文乱码
Hello,寮犱笁,23

5.乱码解决

在Servlet处理请求与响应过程中,会遇到中文乱码问题

由于客户端与服务端传递数据默认的字符集编码为ISO-8859-1纯英文编码,不支持中文

客户端-->服务端 
    
get:
    Tomcat7.x 以前,需要设置字符集编码
     <!--针对于get方式参数字符集-->
     <uriEncoding>UTF-8</uriEncoding>   

    如果是Tomcat8.x,9.x 则不需要设置,默认为UTF-8

post: 
     request.setCharacterEncoding("UTF-8");
    //注:此行代码必须在所有getParmeter()之前



服务端 --> 客户端
   //注:要放在response.getWriter()之前
    response.setContentType("text/html;charset=UTF-8"); 
    
posted @   TerrenceGee  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示