Day40-Servlet原理、Mapping问题、ServletContext
Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器请求之后
Mapping问题
- 一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
查看
- 一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao5</url-pattern>
</servlet-mapping>
查看
- 一个Servlet可以指定通用映射路径
<!--默认请求路径-->
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
查看
- 指定一些后缀或者前缀等等…
<!--可以自定义后缀实现请求映射-->
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>*.xz</url-pattern>
</servlet-mapping>
查看
- 优先级问题
<!--注册Servlet-->
<servlet>
<servlet-name>helloxiaozhao</servlet-name>
<servlet-class>com.xz.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>helloxiaozhao</servlet-name>
<url-pattern>/helloxiaozhao</url-pattern>
</servlet-mapping>
<!--404页面-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.xz.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
查看
默认处理请求(自定义404)
ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
共享数据
我在这个Servlet中保存的数据,可以在另一个servlet中拿到
package com.xz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author 小龚
* @create 2022-08-30 18:11
*/
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 = "小赵";//数据
context.setAttribute("username",username);//将一个数据保存在了ServletContext中,名字为username,值为username(object)
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
out.print("已存放用户名");
}
获取数据的Servlet
package com.xz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author 小龚
* @create 2022-08-30 22:11
*/
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);
}
}
查看
- 未拿到数据
- 存放数据
- 再次运行
获取初始化参数
ServletDemo03
package com.xz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author 小龚
* @create 2022-08-30 22:50
*/
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.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
web.xml配置
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.xz.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
测试
请求转发
ServletDemo04
package com.xz.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author 小龚
* @create 2022-08-30 23:18
*/
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//请求转发
//RequestDispatcher rc = context.getRequestDispatcher("/gp");//转发的请求路径
//rc.forward(req,resp);//调用forward方法实现请求转发
//以上两句合并成一句
context.getRequestDispatcher("/gp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<servlet>
<servlet-name>sd4</servlet-name>
<servlet-class>com.xz.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd4</servlet-name>
<url-pattern>/sd4</url-pattern>
</servlet-mapping>
测试
路径没有变化
读取资源文件
Properties类
- 在java目录下新建properties(需要在注意资源导出失败问题)
- 在resources目录下新建properties
发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classPath
读取配置文件
ServletDemo05
package com.xz.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author 小龚
* @create 2022-08-30 23:55
*/
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");
Properties pp= new Properties();
pp.load(is);
String username = pp.getProperty("username");
String password = pp.getProperty("password");
resp.setContentType("text/html");
resp.getWriter().print(username+";"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
db.properties
username=root
password=123456
web.xml
<servlet>
<servlet-name>sd5</servlet-name>
<servlet-class>com.xz.servlet.ServletDemo05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd5</servlet-name>
<url-pattern>/sd5</url-pattern>
</servlet-mapping>
测试