ServletContext
简介:
上一篇文章说到了Servlet的运行过程,里面提到了在执行servlet中会创建一个Web容器来进行访问和请求。
- Web容器在启动时,它会为每个Web应用程序都创建一个对象的ServletContext对象,它代表当前Web应用
- 多个Servlet通过ServletContext对象来实现数据共享
- 获取Web应用的初始化参数
- 用ServletContext实现请求转发
- 利用ServletContext对象读取资源文件
通过ServletContext来实现数据共享
ServletContext示例:
需求:两个servlet之间通过ServletContext实现数据共享
实现代码:
servlet01如下:(如何导包,上上篇博客图解的很清楚)
public class ServletDemo01 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 {
//这里对请求和响应都进行编码格式的设定(如果不设定,使用中文有可能会发生乱码)
//请求设定为utf-8
request.setCharacterEncoding("utf-8");
//响应也设定为utf-8
response.setCharacterEncoding("utf-8");
//通过servlet对象可以获取一个ServletContext;
ServletContext context = this.getServletContext();
String username = "暮凌寒雪";//可以通过JDBC去读取;
//setAttribute :设置一个属性;(属性名,属性值)
context.setAttribute("name",username);
//将其输出在servlet的web页面
response.getWriter().print("设置name成功:"+username);
}
}
servlet02如下:
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求编码格式设定为utf-8
req.setCharacterEncoding("utf-8");
//响应编码格式设定为UTF-8
resp.setCharacterEncoding("utf-8");
//获取ServletContext对象
ServletContext context = this.getServletContext();
//原本这里是Object对象,因为我们为开发者,知道servlet01传过来的是string对象,因此这里对其进行设定为String对象,并进行了强转
String name = (String) context.getAttribute("name");
//将收到的信息打印在Servlet的web页面中
resp.getWriter().print("我们获取到的ServletDemo01信息为:"+name);
}
}
web.xml配置如下:(每行的意思在之前博客上也有很详细的解释)
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>com.pzy.servlet.ServletDemo01</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>com.pzy.servlet.ServletDemo02</servlet-class>
</servlet>
<!--=====================================================-->
<servlet-mapping>
<servlet-name>servlet01</servlet-name>
<url-pattern>/q1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>/q2</url-pattern>
</servlet-mapping>
结果:
Request
public class RequestDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//查看request对象的方式
System.out.println(request.getContextPath()); //获得web项目路径
System.out.println(request.getRequestURI()); //请求的URL路径
//Remote 远程
System.out.println(request.getRemoteUser()); //获得远程的用户名
System.out.println(request.getRequestedSessionId()); //获得SessionId;
System.out.println(request.getServletPath()); //请求servlet的url
System.out.println(request.getLocalAddr()); //获得本地地址 防火墙
System.out.println(request.getLocalName()); //获得本地名字
System.out.println(request.getLocalPort()); //获得访问的端口号
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
Request和Response示例
需求:Request对象接收前端用户提交的参数
1.编写前端注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<h1>注册</h1>
<form action="${pageContext.request.contextPath}/register" method="post">
<p>
<%-- 控件必须有name属性,因为Servlet要通过name才能接收到用户输入的信息 --%>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<p>
爱好 :
<input type="checkbox" name="hobby" value="girl">女孩
<input type="checkbox" name="hobby" value="code">代码
<input type="checkbox" name="hobby" value="movie">电影
<input type="checkbox" name="hobby" value="music">音乐
</p>
<p>
<input type="submit" value="提交">
<input type="reset" value="重置">
</p>
</form>
</body>
</html>
2.写处理前端提交信息的Servlet如下:
public class FormServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理乱码
req.setCharacterEncoding("UTF-8");
//处理前端的请求
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("接收到的用户名:"+username+"\n密码:"+password+"\n爱好:");
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
/*
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
requestDispatcher.forward(req,resp);
*/
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//睡眠两秒,观察其转发的过程
}
}
3.web.xml文件配置如下:
<servlet>
<servlet-name>Demo01</servlet-name>
<servlet-class>com.kuang.servlet.FormServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo01</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
- 提交测试
- 检查英文提交情况,服务器是否接收成功!
- 提交中文,看看乱码情况
- 设置编码统一,解决乱码问题;
运行服务器结果:
中间会有一个两秒的刷新时间(截不到图…)
重定向和转发的异同:
-
重定向: 服务器告诉客户端你应该请求另外一个地址; (地址栏会变)
resp.sendRedirect(“url”);
参数就是他要重定向的页面 -
转发: 服务器把这个请求转向另外一个Servlet去处理; (地址栏不会变)
RequestDispatcher ,需要使用RequestDispatcher来进行处理,我们需要获得这个类
req.getRequestDispatcher("/success.jsp").forward(req,resp);
参数就是他要转发到的页面