Servlet入门

servlet入门

获取参数

获取信息

设置表单

<form action="add" method="post">    <!-- 通过post方式进行发送,发给add(add知识一个代号) -->
        名称:&nbsp;<input type="text" name="fname"/><br/>
        价格:&nbsp;<input type="text" name="price"/><br/>
        库存:&nbsp;<input type="text" name="foount"/><br/>
        备注:&nbsp;<input type="text" name="remark"/><br/>
        <button>添加</button>
    </form>

把表单中的所有信息通过 post 方式( methods 属性 )发送给服务器,add 对应一个 java 类-> AddServlet sever 服务器,let 小应用程序
1.获取用户(客户端)发给我的数据
2.通过调用方法完成添加功能
3.在控制台打印添加成功
jdbc 与数据库进行交互存储信息

add 相关类信息要新建在 src 文件夹下面
普通的类还不能够获取用户发来的数据,要去继承 HttpServlet

HttpServlet 不在 JDK 包中,在 tomcat\lib\servlet-api.jar 中,可以通过导入 jar 包或添加 tomcat 依赖实现

参数1 request
客户端发送请求:HttpRequest
获取信息使用 request.getParameter() 函数,获取到的信息只能是字符串,可以使用强转

package com.ppqppl.servlets;

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 AddServlet extends HttpServlet {
    @Override
    //doPost是从父类中调用来的。使用protected,使用public也可以,即 >= 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   //响应post请求
//        super.doPost(req, resp);
        // getParameter()就是获取参数
        String fname = new String(request.getParameter("fname").getBytes("iso-8859-1"), "utf-8");   //解决从网页传回中文乱码的情况
        String priceStr = request.getParameter("price");
        Integer price = Integer.parseInt(priceStr);
        String fcountStr = request.getParameter("fcount");
        Integer fcount = Integer.parseInt(fcountStr);
        String remark = request.getParameter("remark"); //从网页传回是用的时 iso-8859-1 编码,所以会生成乱码

        System.out.println("fname = "+fname);
        System.out.println("price = "+price);
        System.out.println("fcount = "+fcount);
        System.out.println("remark = "+remark);
        System.out.println("乱码测试");
        //网页输入中文终端输出时会乱码
    }
}

配置对应关系

在web.xml中进行设置

    <servlet>
    <!-- 名称可以随便写,但是类名要进行对应,一个 servlet 可以对应多个 servlet-mapping -->
        <servlet-name>AddServlet</servlet-name>
        <servlet-class>com.ppqppl.servlets.AddServlet</servlet-class>
    </servlet>
    <!-- 映射,发出请求和接受请求的名称要进行一一对应,一个 servlet-mapping 只能对应一个 servlet -->
    <servlet-mapping>
        <servlet-name>AddServlet</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>

//或者直接如下:
@WebServlet("/add")	// Servlet 从 3.0 版本开始支持注解方式注册,可以直接不使用 web.xml 文件,但是 thymeleaf 中有些配置要写到里面

具体流程如下:
1.用户发请求:action = add
2.项目中,web.xml中找到url-patten = /add
3.找到servlet-name = AddServlet
4.找和servlet-mapping中servlet-name一致的servlet
5.找到servlet-class -> com.ppqppl.servlets.AddServlet
6.用户发送的是post请求(method = post),因此tomcat或执行AddServlet中的doPost方法

请求add.html -> 服务器给出响应 Http Request -> 看到表单,输入数据点击添加 ->数据发给服务器 action=add method=post ->
服务器中组件 add 在 web.xml 中与 AddServlet 对应 -> 经过三个步骤->重写doPost方法

处理请求参数中文乱码

设置编码

由于tomcat底层编码为 "ISO-8859-1",所以有些输入后进行获取会产生乱码
我们就需要将其转换为 "UTF-8" 编码进行输出

Post

post方式下设置编码,防止中文乱码
注意:设置编码代码行必须放在多有的获取参数动作之前,否则就算设置了,还会产生所有中文都是乱码的情况

requset.setCharacterEncoding("UTF-8");

还可以使用这句代码,但是比较麻烦,需要每获取一个值就转换一次

 String fname = new String(request.getParameter("fname").getBytes("iso-8859-1"), "utf-8");

Get

get方式先不需要设置编码(基于 tomcat8 ),如果使用 tomcat8 (不包括)之前的版本,就要注意设置编码

1.将字符串打散成字节数组
2.即将字节数组按设定的编码重新组装成字符串

String fname = request.getParameter("fname");
byte[] bytes = fname.getBytes("ISO-8859-1");	// 先转为 bytes
fname = new String (bytes,"UTF-8");			   // 再从 bytes 转回 sting

继承关系

继承关系

Servlet接口:
实现类-> javax.servlet.GenericServlet 抽象类:
子类-> javax.servlet.http.HttpServlet 基于Http协议,是GenericServlet下的一个抽象子类,源码如下:

public abstract class HttpServlet extends GenericServlet(){
    
}

相关方法

javax.servlet.Servlet 接口:
void init(config) - 初始化方法
void service(request,response) - 服务方法:
当客户端发送了请求,无论是表单还是点槽连接,service方法会自动被调用执行
void destory()

javax.servlet.GenericServlet 抽象类
void service(request,response) - 仍然是抽象的

javax.servlet.http.HttpServlet 抽象子类
void service(request,response) - 不是抽象的
1.String method = req.getMethod(); 获取请求的方式(总共有8个):GET,POST,PUT,DELETE,OPTIONS,TRACE,CONNECT,HEAD
2.各种 if 判断,根据请求方式不同,决定去调用不同的do方法

	    if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

​ 3.在HttpServlet抽象类中,do方法基本相似

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_get_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }

​ 没有写 doGet,会去调用父类中的 doGet 方法,其实调用的是 this.doGet,然后按曾寻找,显示报错msg

小结

  1. 继承关系:HttpServlet -> GenericServlet -> Servlet
  2. Servlet 中的核心方法 init()、service()、destory()
  3. 服务方法( service 方法):当有请求过来时,service方法会自动相应(其实是 tomcat 容器调用的)
    在 HttpServlet 中我们会分析请求的方式:是 get、post、head 还是 delete 等
    然后再决定调用的 do 开头的执行方法
    那么在 HttpServlet 中这些 do 方法默认都是 405 的实现风格 - 要我们子类去实现( 重写 )对应的方法,否则直接默认报错 405
    父类中方的 do 方法默认是报错 405,如果没有重写,则默认调用父类 do 方法
  4. 因此,我们在新建 Servlet 时,我们才会去考虑请求方法,从而决定重写哪种 do 方法
posted @ 2022-05-15 16:43  ppqppl  阅读(17)  评论(0编辑  收藏  举报