【Javaweb系列】-教你搞定Servlet(手撸个2万字)中

4. Mapping问题

4.1 一个Servlet可以指定一个映射路径

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

4.2 一个Servlet可以指定多个映射路径

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello2</url-pattern>
  </servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello3</url-pattern>
  </servlet-mapping>

4.3 一个Servlet可以指定通用映射路径

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>

4.4 默认请求路径

<!-- 默认请求路径。这个少用-->
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

4.5 指定一些后缀或者前缀等等…

<!--  可以自定义后缀实现请求映射。注意:*前面不能加项目映射的路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.hxl</url-pattern>
  </servlet-mapping>

4.6 优先级问题

指定的固有的映射路径优先级最高,如果找不到会找默认的处理请求。

<!-- 注册Servlet   -->
  <servlet>
    <servlet-name>error</servlet-name>
    <servlet-class>com.hxl.servlet.ErrorServlet</servlet-class>
  </servlet>
  <!--  Servlet的请求路径  -->
  <servlet-mapping>
    <servlet-name>error</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

5. ServletContext

web容器容器中的溶剂或易燃化学品在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。

5.1 共享数据

  • 我在这个Servlet中保存的数据,可以在另外一个Servlet中找到

放置数据的类

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //this.getInitParameter()     初始化参数
        //this.getServletConfig()     Servlet配置
        //this.getServletContext()    Servlet上下文
        ServletContext context = this.getServletContext();
        String username = "hxl"; //如果这里的值是中文,就要注意编码和响应
        context.setAttribute("username",username); //将一个数据保存在了ServletContext中,名字为username,值为username
    }
}

读取它的类

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字" + username);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

配置它的xml

  <servlet>
    <servlet-name>getc</servlet-name>
    <servlet-class>com.hxl.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getc</servlet-name>
    <url-pattern>/getc</url-pattern>
  </servlet-mapping>

测试访问结果

如果没有设置编码会出现两个问号java语言3;null。设置之后就会出现

设置过后&#容器xff0c;直接访问getc还是控制,这是因为还没有进行存,我们先访问一下hello这个页面,进行存取&容器技术#xff0c;hello这容器苗个页面是空的。不管它,然后再访问getc会小毛驴简谱发现结果出来了。

5.2 获取初始化参数

在web.xml中配置

<!--配置web应用初始化参数-->
  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>

取的位置

public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在web.xml中配置

<servlet>
    <servlet-name>gp</servlet-name>
    <servlet-class>com.hxl.servlet.ServletDemo03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>gp</servlet-name>
    <url-pattern>/gp</url-pattern>
  </servlet-mapping>

5.3 请求转发

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        System.out.println("进入了ServletDemo04");
        /*
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
        requestDispatcher.forward(req,resp); //调用forward实现请求转发
        */
        //上面两句合并之后
        context.getRequestDispatcher("/gp").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
  <servlet-name>sd4</servlet-name>
  <servlet-class>com.hxl.servlet.ServletDemo04</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>sd4</servlet-name>
    <url-pattern>/sd4</url-pattern>
  </servlet-mapping>

【Javaweb系列】-教你搞定Servlet(手撸个2万字)中

  • 上图中第一种是请求转发:A要拿到C的资源,先找B拿&javaee#xff0c;B容器中的溶剂发生燃烧应如何处理在找C拿,C把资源给了B,B再把资源给了A

另一种方法是重定向,A问B要拿C的资源,B告诉A去找C拿,然后A再去找C

5.4 读取资源文件

Properties

  • 在java目录下新建properties
  • 在resources目录下新建pjava环境变量配置roperties

java模拟器现都被打包到同一个路径下:classes,我们俗称这个路径为classpath;

public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("WEB-INF/classes/db.properties");//把资源变成流,最开始的/不能省略他表示当前web项目   。这个地方如果报500就是位置错误,修改值加个/  我是加了报错,我就删掉了
        Properties prop = new Properties();
        prop.load(is);
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        resp.getWriter().print(username + ":" + password);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在xml文件下配置请求路径

测试java面试题结果:

root:123456