一.ServletContext
ServletContext的作用:
1. 获取全局参数
2. 获取工程里面的资源。
3. 资源共享。
服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象从服务器移除托管,或者是关闭服务器。
ServletContext 的作用范围:只要在同一个项目里面,都可以取。 不同项目取不了,因为 ServletContext对象不同。
需要用到的两个方法:
代码如下:
在web.xml中配置ServletContextDemo:
在web.xml中配置context-param:
浏览器中访问ServletContextDemo(http://localhost:8080/DJCKING/ServletContextDemo )
控制台显示获取到的数据:
二.重定向登录案例
login.html如下:
登录成功页面:
LoginServlet.java
package djc.king;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* request:包含请求的信息
* response:响应数据给浏览器
*/
@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
String userName = request.getParameter("username");
String passWord = request.getParameter("password");
//A.1.指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//B.2.直接设置浏览器中看数据的编码为UTF-8
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//校验数据
checkData(userName, passWord, response);
}
/**
* 校验数据的方法
* @param userName
* @param passWord
*/
private void checkData(String userName, String passWord, HttpServletResponse response) throws IOException {
if (userName.equals("admin") && passWord.equals("123")) {
//设置状态码 302对应的状态是FOUND
//response.setStatus(302);
//方法1:定位跳转的页面 设置Location响应进行资源的重定向,那么还需要设置状态码
// response.setHeader("Location", "login_success.html");
//方法2:重定向中用的多的是sendRedirect 推荐使用
response.sendRedirect("login_success.html");
} else {
PrintWriter pw = response.getWriter();
pw.write("大兄弟!!!你登录失败,error!!!");
}
}
}
配置LoginServlet:
执行流程:
乱码说明:
客户端浏览器显示出现乱码情况,就是编码不一致造成的;
所以我们需要使用下面几行代码规定编码:
//A.1.指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//B.2.直接设置浏览器中看数据的编码为UTF-8
response.setHeader("Content-Type", "text/html;charset=UTF-8");
或者推荐使用下面这一行简单代码:
//最好的解决方法
response.setContentType("text/html;charset=UTF-8");
解决乱码后运行效果如下:
下面来说说重定向的问题:
当用户输入的用户名和密码,均正确,就可以跳转到成功页面,即login.html页面。目前我知道的有三种方法:
方法1:
//设置状态码 302对应的状态是FOUND
response.setStatus(302);
//方法1:定位跳转的页面 设置Location响应进行资源的重定向,那么还需要设置状态码
response.setHeader("Location", "login_success.html");
方法2.
//方法2:重定向中用的多的是sendRedirect 推荐使用
response.sendRedirect("login_success.html");
运行效果如下:
总结:
- 地址上显示的是最后的那个资源的路径地址
- 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
- 可以跳转到任意路径。 不是自己的工程也可以跳。
- 效率稍微低一点, 执行两次请求。
- 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。
使用**"请求转发**"来解决 没法使用上一次的request对象这个问题。
//请求转发的写法: 实际上参数login_success.html即跳转的位置但是地址上显示的是请求servlet的地址
request.getRequestDispatcher("login_success.html").forward(request, response);
效果如下:
总结:
1. 地址上显示的是请求servlet的地址。 返回200 ok
.2. 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
3. 只能跳转自己项目的资源路径 。
.4. 效率上稍微高一点,因为只执行一次请求。
5. 可以使用上一次的request对象。