ServletContext
每个web工程都只有一个ServletContext对象,也就是不管在哪个Servlet里面,获取到的这个类的对象都是同一个,它用来获取Servlet的上下文,在服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象,当从服务器移除托管或者是关闭服务器时,ServletContext将会被销毁。它主要有以下几方面作用:
- 获取全局配置参数
- 获取web工程中的资源
- 在servlet间共享数据域对象
获取全局配置参数
在web.xml中新增一下以下代码
<context-param>
<param-name>username</param-name>
<param-value>zed</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
在MyHttpServlet的doGet方法中新增以下代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet method invoke...");
//获取全部初始化名称和其对应的内容
Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String InitParameterName = initParameterNames.nextElement();
String initParameter = getServletContext().getInitParameter(InitParameterName);
System.out.println(initParameter);
}
}
重启Tomcat服务器,在浏览器中访问
获取web工程中的资源
在webapp文件夹中创建a.txt文件,内容为hello world
在MyHttpServlet的doGet方法中新增以下代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet method invoke...");
//获取全部初始化名称和其对应的内容
Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String InitParameterName = initParameterNames.nextElement();
String initParameter = getServletContext().getInitParameter(InitParameterName);
System.out.println(initParameter);
}
//获取web工程中的资源的绝对路径
String realPath = getServletContext().getRealPath("a.txt");
System.out.println(realPath);
//获取web工程中的资源的输入流对象
InputStream resourceAsStream = getServletContext().getResourceAsStream("a.txt");
System.out.println(resourceAsStream);
}
重启Tomcat服务器,在浏览器中访问
在Servlet间访问共享数据域对象
创建LoginServlet并配置请求映射
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.ccl.servlet.demo.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/ls</url-pattern>
</servlet-mapping>
在LoginServlet的doGet中是实现登录次数的修改,默认为1
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取当前登录次数
Integer count = (Integer) getServletContext().getAttribute("count");
//如果当前登录为null,则设置默认值为1
if (count == null){
getServletContext().setAttribute("count",1);
}else {
getServletContext().setAttribute("count",count+1);
}
}
在MyHttpServlet的doGet中新增以下查看代码,用于查看当前登录次数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet method invoke...");
//获取全部初始化名称和其对应的内容
Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String InitParameterName = initParameterNames.nextElement();
String initParameter = getServletContext().getInitParameter(InitParameterName);
System.out.println(initParameter);
}
//获取web工程中的资源的绝对路径
String realPath = getServletContext().getRealPath("a.txt");
System.out.println(realPath);
//获取web工程中的资源的输入流对象
InputStream resourceAsStream = getServletContext().getResourceAsStream("a.txt");
System.out.println(resourceAsStream);
//查看当前网站登录次数,这个数据是保存ServletContext中的
Integer count = (Integer) getServletContext().getAttribute("count");
//判断是否登录过,如果没有登录过,提示未登录过,如果已登录过,显示登录次数
if (count == null){
resp.getWriter().write("no login");
}else {
resp.getWriter().write("count:" + count);
}
}
重启Tomcat服务器
访问呢MyHttpServlet页面,查看是否登录
访问LoginServlet页面,模拟登录场景
访问呢MyHttpServlet页面,查看是否登录
ServletConfig
通过ServletConfig对象可以获取Servlet在配置的时候的一些信息
创建类HelloServlet
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
在web.xml中配置映射关系
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.ccl.servlet.demo.HelloServlet</servlet-class>
<!-- Servlet的初始化参数-->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<!-- Servlet的加载顺序-->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hs</url-pattern>
</servlet-mapping>
在HelloServlet的doGet方法中新增以下代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Enumeration<String> initParameterNames = getServletConfig().getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String initParameterName = initParameterNames.nextElement();
String initParameterValue = getServletConfig().getInitParameter(initParameterName);
System.out.println(initParameterName + ":" + initParameterValue);
}
}
重启Tomcat服务器,在浏览器中访问
HttpServletRequest
HttpServletRequest这个对象封装了客户端提交过来的一切数据
修改index.jsp
<form action="rs" method="get">
账号:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
<input type="submit" value="注册">
</form>
创建类RegisterServlet
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取客户端传递过来的头部信息
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = resp.getHeader(headerName);
System.out.println(headerName + ":" + headerValue);
}
System.out.println("=============");
//获取客户端传递过来的参数信息
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()){
String parameterName = parameterNames.nextElement();
String parameterValue = req.getParameter(parameterName);
System.out.println(parameterName + ":" + parameterValue);
}
System.out.println("=============");
//以map集合的形式获取客户端传递过来的参数信息
Map<String, String[]> parameterMap = req.getParameterMap();
Set<String> names = parameterMap.keySet();
for (String name : names){
String[] value = parameterMap.get(name);
System.out.println(name + ":" + Arrays.toString(value));
}
System.out.println("=============");
//获取一些其他地址,查询等信息
StringBuffer requestURL = req.getRequestURL();
String requestURI = req.getRequestURI();
String servletPath = req.getServletPath();
String queryString = req.getQueryString();
System.out.println("requestURL:" + requestURL);
System.out.println("requestURI:" + requestURI);
System.out.println("servletPath:" + servletPath);
System.out.println("queryString:" + queryString);
}
}
在web.xml中新增映射信息
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.ccl.servlet.demo.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/rs</url-pattern>
</servlet-mapping>
重启Tomcat服务器,访问页面并输入数据提交
IDEA控制器信息
host:null
connection:null
sec-ch-ua:null
sec-ch-ua-mobile:null
upgrade-insecure-requests:null
user-agent:null
accept:null
sec-fetch-site:null
sec-fetch-mode:null
sec-fetch-user:null
sec-fetch-dest:null
referer:null
accept-encoding:null
accept-language:null
cookie:null
=============
username:asd
password:123
=============
username:[asd]
password:[123]
=============
requestURL:http://localhost:8080/sr/rs
requestURI:/sr/rs
servletPath:/rs
queryString:username=asd&password=123
解决请求数据中文乱码问题
GET方式
// 先用原来的编码解码再用UTF—8重新编码。
String newUsername = new String(username.getBytes("ISO-8859-1"), "UTF-8");
POST方式
// 这行设置一定要写在getParameter之前。
request.setCharacterEncoding("UTF-8");
HttpServletResponse
HttpServletResponse这个对象负责返回数据给客户端
创建类DisplayServlet
public class DisplayServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 以下两种方式只能用一种
*/
//字符流
resp.getWriter().write("<h1>hello response 111...</h1>");
//字节流
//resp.getOutputStream().write("hello response 222...".getBytes());
}
}
在web.xml文件中新增以下映射信息
<servlet>
<servlet-name>DisplayServlet</servlet-name>
<servlet-class>com.ccl.servlet.demo.DisplayServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayServlet</servlet-name>
<url-pattern>/ds</url-pattern>
</servlet-mapping>
重启Tomcat服务器,在浏览器中访问
解决响应数据中文乱码问题
以字符流输出:response.getWriter()
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("你好,世界!");
以字节流输出:response.getOutputStream()
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("你好,世界!".getBytes("UTF-8"));
重定向和请求转发
重定向
// 第一种:使用示例
response.setStatus(302);
response.setHeader("Location", "login_success.html");*/
// 第二种:使用示例
response.sendRedirect("login_success.html");
1. 地址上显示的是最后的那个资源的路径地址。
2. 请求次数最少有两次,服务器在第一次请求后,会返回302以及一个地址,浏览器在根据这个地址,执行第二次访问。
3. 可以跳转到任意路径,不是自己的工程也可以跳。
4. 效率稍微低一点,执行两次请求。
5. 后续的请求,没法使用上一次的request存储的数据,或者没法使用上一次的request对象,因为这是两次不同的请求。
请求转发
// 使用示例:
request.getRequestDispatcher("login_success.html").forward(request, response);
1. 地址上显示的是请求servlet的地址,返回200ok。
2. 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作。
3. 只能跳转自己项目的资源路径。
4. 效率上稍微高一点,因为只执行一次请求。
5. 可以使用上一次的request对象。