Servlet使用

本文介绍了如何创建和配置Java EE Servlet,包括使用注解简化配置,以及处理HTTP请求和响应。同时,讲解了Servlet的生命周期,并展示了如何设置编码避免中文乱码问题。此外,还探讨了过滤器的使用,以及处理POST请求中文参数乱码的解决方案。
摘要由CSDN通过智能技术生成

初步使用

创建项目

创建Java Enterprise项目,项目结构如下
项目结构
1、其中pom.xml文件默认已经添加javax.servlet-api依赖
2、web.xml是配置文件;因为Tomcat默认回去目录下寻找index.html,index.jsp名的文件当作首页,所以运行项目的时候,会显示index.jsp文件的内容
3、在idea中可以直接创建定义好的servlet类,如果勾选了Create Java EE 6+ annotated class创建的类会带有注解,在servlet的xml配置文件中可以不配置servlet

创建自定义的Servlet类
package com.fssx.TestWeb;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
// 使用注解的方法配置servlet,name是servlet的自定义名称,value是访问的地址,loadOnStartup表示会在tomcat启动的时候就直接加载servlet,而不用等待我们访问才加载,数值越大越先加载
@WebServlet(name = "test", value = "/test", loadOnStartup = 15)
public class ServletIndex extends HttpServlet {
    // 初始化方法会在第一次加载这个servlet时调用,后续每次再访问的时候不再调用
    @Override
    public void init() throws ServletException {
        System.out.println("调用init方法");
    }
    // 每次访问的时候都会调用
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("调用service方法");
        super.service(req, res);
    }
    // 根据请求方式分配调用的方法,常用的是Get和Post方法
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String name=null;
        // 获取所有的参数名
        Enumeration parameters = request.getParameterNames();
        // 判断集合内是否有元素
        while (parameters.hasMoreElements()) {
            // 获取元素key
            String key= (String) parameters.nextElement();
            // 通过key获取value
            name = request.getParameter(key);
        }
        if (name == null) {
            name = "World";
        }
        Cookie cookie = new Cookie("name", name);
        cookie.setMaxAge(60*60*24);
        response.addCookie(cookie);
        System.out.println("调用doGet方法");
        // 设置响应内容的格式,如果不设置为utf-8,默认使用的是iso-8859-1,对于中文会有乱码
        response.setContentType("text/html;charset=UTF-8");
        // 创建自动缓冲字符输出流
        PrintWriter writer = response.getWriter();
        // 将字符串写入输出流中
        writer.println("<h1>Hello</h1>");
        writer.println("<h1>"+name+"</h1>");
        writer.println("<a>!</a>");
        writer.println("<a>!</a>");
        writer.println("<a>!</a>");
    }
    // 根据请求方式分配调用的方法,常用的是Get和Post方法
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("调用doPost方法");
        // 设置请求内容的格式,如果不设置为utf-8,默认使用的是iso-8859-1,对于中文会有乱码
        request.setCharacterEncoding("utf-8");
        Cookie [] cookies = request.getCookies();
        if (cookies.length>=1){
            String key = cookies[0].getName(), value = cookies[0].getValue();
            System.out.println("cookie中的"+key+"的值为"+value);
        }
        String name = request.getParameter("name");
        if (name == null) {
            name = "World";
        }
        System.out.println(name);
    }
    // 在servlet销毁时调用(使用tomcat关闭,而非关闭网页时)
    @Override
    public void destroy() {
        System.out.println("调用destroy");
    }
}
修改Xml配置文件

xml配置和注解配置二选一

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    将servlet类添加别名-->
    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>com.fssx.TestWeb.ServletIndex</servlet-class>
        <load-on-startup>15</load-on-startup>
    </servlet>
<!--    将servlet和访问路径匹配-->
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>S

这时候我们的网页已经可以访问了,servlet的生命周期
1、加载阶段:加载并实例化(创建Servlet实例),调用构造方法
2、初始化阶段:调用init()方法(第一次实例化Servlet时调用,后续不会创建新的)
3、响应客户请求阶段:调用service()方法,根据请求方式调用doGet、doPost
4、终止阶段:调用destroy()方法(Tomcat关闭时调用)

常用方法

1、获取前端发送的参数

Enumeration parameters = request.getParameterNames();
//判断集合内是否有元素
while (parameters.hasMoreElements()) {
    // 获取元素key
    String key= (String) parameters.nextElement();
    // 通过key获取value
    name = request.getParameter(key);
}

2、获取、插入Cookie

Cookie cookie = new Cookie("name", "李四"); // 创建新的Cookie
cookie.setMaxAge(60*60*24); // 设置存活时间为1天
response.addCookie(cookie); // 添加Cookie到响应体中

Cookie [] cookies = request.getCookies(); // 获取所有的Cookie对象
String key = cookies[0].getName(); // 获取数组中第一个Cookie的Name
String value = cookies[0].getValue(); // 获取数组中的第一个Cookie的Value

3、设置编码格式

request.setCharacterEncoding("utf-8"); // 设置请求体的解析编码格式
response.setContentType("text/html;charset=UTF-8"); // 设置响应体的解析编码格式

过滤器

package com.fssx.Filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
// 使用注解配置就不需要配置xml了,二选一 filterName为过滤器自定义名词,servletNames,urlPatterns为匹配路径
@WebFilter(filterName = "FilterOne",servletNames = "test")
public class FilterOne implements Filter {
    // 初始化方法
    public void init(FilterConfig config) throws ServletException {
        System.out.println("调用过滤器init方法");
    }
    // 销毁方法
    public void destroy() {
        System.out.println("调用过滤器destroy方法");
    }
    // 过滤方法
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("开始过滤");
        String name = request.getParameter("name");
        if ("lisi".equals(name)) {
            // 程序正常往下运行,执行下一个过滤器或者回到servlet中
            chain.doFilter(request, response);
            // 请求返回后继续执行后面的内容
            System.out.println("返回过滤");
        } else {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter writer= response.getWriter();
            writer.println("错误,用户名不是lisi");
        }
    }
}

xml配置

<servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>filterOne</filter-name>
        <filter-class>com.fssx.Filter.FilterOne</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterOne</filter-name>
        <servlet-name>test</servlet-name>
    </filter-mapping>

问题

使用中文出现乱码
1、post请求的中文参数乱码

request.setCharacterEncoding("utf-8");

对于请求的参数,get请求的参数保存在请求头中,由tomcat使用utf-8解码,能够正常显示
而post请求的参数保存在请求体重,由request解析,使用iso-8859-1,中文会有乱码,所以
我们需要提前设置编码格式为utf-8.
2、response输出流中文乱码

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

设置响应内容的格式,如果不设置为utf-8,默认使用的是iso-8859-1,浏览器对于中文会有乱码
3、HttpServletRequest和ServletRequest的关系

1、他们都是接口
2、HttpServletRequest继承了ServletRequest;
3、HttpServletRequest比ServletRequest多了一些针对于Http协议的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值