urlPattern配置和request

urlPattern配置

Servlet类编写好后,想要被访问到,就需要配置其访问路径(urlPattern)

一个Servlet可以配置多个urlPattern

@WebServlet(urlPatterns={"/demo","/demo2"})

urlPattern配置规则:

精准匹配

配置路径:@WebServlet("/user/select")

访问路径:localhost:8080/web/user/select

目录匹配

配置路径:@WebServlet("/user/ * ")

访问路径:localhost:8080/web/user/aaa

                  localhost:8080/web/user/bbb

扩展名匹配

配置路径:@WebServlet(" * . do ")

访问路径:localhost:8080/web-demo/a.do

                  localhost:8080/web-demo/b.do

如果路径配置的不是扩展名,那么在路径的前面就必须要加 / 否则会报错
如果路径配置的是 *.do ,那么在*.do的前面不能加 / ,否则会报错

任意匹配

配置路径:@WebServlet("/")

                  @WebServlet("/ * ")

访问路径:localhost:8080/web-demo/hehe

                  localhost:8080/web-demo/haha

/ 和 /* 的区别:

当我们的项⽬中的Servlet配置了 "/",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会⾛这个Servlet
当我们的项⽬中配置了"/*",意味着匹配任意访问路径
DefaultServlet是⽤来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有⾛默认的⽽是⾛了⾃定义的Servlet类,最终导致静态资源不能被访问

Request&Response 

请求对象和响应对象。

使用Servlet时见过的:

urlPattern配置和request_第1张图片

request:获取请求数据

response:设置响应数据

Request对象;

当我们的Servlet类实现的是Servlet接⼝的时候,service⽅法中的参数是ServletRequest和ServletResponse
当我们的Servlet类继承的是HttpServlet类的时候,doGet和doPost⽅法中的参数就变成HttpServletRequest和HttpServletReponse
urlPattern配置和request_第2张图片
ServletRequest 和 HttpServletRequest是继承关系,并且两个都是接口,无法创建对象,那么service和doGet这些方法参数中的对象是由谁创建的呢?——>RequestFacade:这个类实现了HttpServletRequest接口,也间接实现了ServletRequest接口。
Servlet类中的service方法、doGet方法或是doPost方法最终都是由Web服务器【Tomcat】来调用的, 是Tomcat提供了方法参数接口的具体实现类,并完成了对象的创建

中文乱码问题:

GET请求在Tomcat8.0以后的版本就不会出现了

POST请求的解决方案是:设置输入流的编码

request.setCharacterEncoding("UTF-8");

通用方式(GET / POST):需要先解码,再编码

new String(username.getBytes("ISO-8859-1"),"UTF-8");

Request请求转发:

请求转发(forward):一种再服务器内部的资源跳转方式

urlPattern配置和request_第3张图片

请求转发的实现⽅式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
        System.out.println("demo5...");
        //在RequestDemo5的doGet方法中进行请求转发
        request.getRequestDispatcher("/req6").forward(request,response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
        this.doGet(request, response);
    }
}

你可能感兴趣的:(servlet,tomcat)