@WebServlet 用法 @WebFilter 用法以及解決中文亂碼

servlet路徑錯誤

今天idea寫了個servlet
默認生成的
@WebServlet(name=“getParameter”)
然後在訪問的時候無法訪問,

servlet路徑配置方法

@WebServlet方法,推薦

修改爲
@WebServlet("/getParameter")
可以通過
http://localhost:8080/servlet2_war_exploded/getParameter?x1=lmkservlet
進行訪問
源代碼

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

@WebServlet("/getParameter")
public class getParameter extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String x1=request.getParameter("x1");

            PrintWriter out1=response.getWriter();
            out1.print("<html><body><p> 請求參數x1的值爲"+x1+"</p></body></html>");

    }
}

web-xml 配置路徑方法,老方法

或者也可以再 web-iml 中進行配置

<?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-name>Hello</servlet-name>
        <servlet-class>Hello</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/Hello</url-pattern>
    </servlet-mapping>
</web-app>

解決servlet 中文亂碼的方法

方法一直接設定 字符集

這樣的好處就是簡單,
但是當幾十個servlet都採用這種方式,每次設定都很麻煩
當servlet很多是,我推薦 方法二 全局過濾器 Filter

		//設置請求字符集
		request.setCharacterEncoding("utf-8");
		//設置響應頭字符集,告訴瀏覽器是什麼字符集
        response.setContentType("text/html;charset=utf-8");
        //設置響應字符集
        response.setCharacterEncoding("utf-8");

完整代碼

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

@WebServlet("/getParameter")
public class getParameter extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        String x1=request.getParameter("x1");

            PrintWriter out1=response.getWriter();
            out1.print("<html><body><p> 請求參數x1的值爲"+x1+"</p></body></html>");

    }
}

方法二 設定全局過濾器

Filter的執行順序與在web.xml配置文件中的配置順序一致,一般把Filter配置在所有的Servlet之前。

過於過濾器的幾點常識
過濾器只會被初始化一次
所以過濾器常駐內存

所以只有很必要的操作才需要使用過濾器

在這裏插入圖片描述

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

//指定路徑匹配 以及過濾器名稱,  /* 就是全局所有請求都匹配
@WebFilter(filterName = "setCharacterCoding" ,urlPatterns = "/*")
public class setCharacterCoding implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String codingmode="utf-8";

        req.setCharacterEncoding(codingmode);
        resp.setContentType("text/html;charset="+codingmode);
        resp.setCharacterEncoding(codingmode);
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
    }
}


啓用全局過濾器之前
在這裏插入圖片描述

啓用全局過濾器之後
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章