Servlet获取参数及编码问题

187 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

Servlet

获取参数

获取参数并添加到数据库中

AddServlet.java

package com.sentiment.servlets;
​
import com.sentiment.fruit.dao.impl.FruitDAOImpl;
import com.sentiment.fruit.pojo.Fruit;
​
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
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String fname = req.getParameter("fname");
        String priceStr = req.getParameter("price");
        Integer price = Integer.parseInt(priceStr);
        String fcountStr = req.getParameter("fcount");
        Integer count = Integer.parseInt(fcountStr);
        String remark = req.getParameter("remark");
​
        System.out.println(fname);
        System.out.println(price);
        System.out.println(count);
        System.out.println(remark);
        FruitDAOImpl fruitDAO = new FruitDAOImpl();
        fruitDAO.addFruit(new Fruit(0,fname,price,count,remark));
        System.out.println("添加成功");
    }
}

add.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Servlet</title>
</head>
<body>
    <form action="add" method="post">
        名称:<input type="text" name="fname"><br/>
        价格:<input type="text" name="price"><br/>
        库存:<input type="text" name="fcount"><br/>
        备注:<input type="text" name="remark"><br/>
        <input type="submit" value="添加">
    </form>
</body>
</html>

web.xml

<servlet>
    <servlet-name>AddServlet</servlet-name>
    <servlet-class>com.sentiment.servlets.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AddServlet</servlet-name>
    <url-pattern>/add</url-pattern>
</servlet-mapping>

单击添加,添加成功

流程

1、点击添加时,action=add

2、找到url-pattren = /add

3、就找到了<servlet-name>—>AddServlet

4、servlet-mapping中的AddServlet对应了servlet的AddServlet

5、对应上之后找到了com.sentiment.servlets.AddServlet

6、发送post请求,并有AddServlet的doPost方法接收

设置编码

前边添加数据时,其实遇到一些问题,当添加中文名称时会出现乱码的情况,所以需要手动设置一下编码格式

POST

设置成UTF-8即可

req.setCharacterEncoding("UTF-8");

GET

GET方式麻烦一些,由于tomcat默认使用的是ISO-8859-1编码,所以需要先获取此编码的字节,之后再转换成UTF-8

String fname = req.getParameter("fname");
byte[] bytes = fname.getBytes("ISO-8859-1");
fname= new String(bytes,"UTF-8");

继承关系

继承关系

javax.servlet.Servlet 接口
    javax.servlet.GenericServlet 抽象类
        javax.servlet.http.HttpServlet 抽象子类

相关方法

javax.servlet.Servlet接口:

void init(config) - 初始化方法
void service(request,response) - 服务方法
void destory() - 销毁方法

javax.servlet.GenericServlet抽象类:

public abstract void service(request, response) - 仍然是抽象方法

javax.servlet.http.HttServlet 抽象子类:

void service (request,response) - 不是抽象的

看一下HttpServlet方法

①:获取请求方式 (一共有八种请求方式,这里以GET为例)

②:判断为GET后,执行getLastModified()方法,而这个方法默认返回值就是-1L

③:经过if判断之后调用了本类中的doGet方法

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方法,相当于默认返回错误信息,该信息的值封装在http.method_get_not_supported中,而这些信息都在LocalStrings的配置文件中

因此为了避免报错,才需要我们在传入对应请求前,重写对应的do方法