ServletContext和重定向&请求转发&登录并解决中文乱码案例总结

一.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");

运行效果如下:
在这里插入图片描述
总结:

  1. 地址上显示的是最后的那个资源的路径地址
  2. 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
  3. 可以跳转到任意路径。 不是自己的工程也可以跳。
  4. 效率稍微低一点, 执行两次请求。
  5. 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。

使用**"请求转发**"来解决 没法使用上一次的request对象这个问题。

//请求转发的写法: 实际上参数login_success.html即跳转的位置但是地址上显示的是请求servlet的地址
request.getRequestDispatcher("login_success.html").forward(request, response);

效果如下:
在这里插入图片描述
在这里插入图片描述
总结:
1. 地址上显示的是请求servlet的地址。 返回200 ok
.2. 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
3. 只能跳转自己项目的资源路径 。
.4. 效率上稍微高一点,因为只执行一次请求。
5. 可以使用上一次的request对象。
在这里插入图片描述

请求转发重定向都是HTTP协议中常用的两种跳转方式,它们的区别在于跳转的方式不同。请求转发是在服务器端进行的跳转操作,而重定向则是在客户端进行的跳转操作。下面我将分别介绍两种跳转方式的流程和原理。 ## 请求转发 请求转发是指在服务器端将一个请求转发给另一个资源进行处理。在这个过程中,浏览器只发起了一次请求,服务器端将这个请求转发给了另一个资源,并将处理结果返回给浏览器。 请求转发的流程如下: 1. 浏览器向服务器发送请求。 2. 服务器接收到请求后,根据请求的URL地址找到对应的Servlet或JSP。 3. Servlet或JSP处理请求,生成响应结果。 4. Servlet或JSP将响应结果转发给另一个Servlet或JSP进行处理。 5. 最后,另一个Servlet或JSP将处理结果返回给浏览器。 请求转发的原理是通过request对象的forward()方法实现。具体来说,当Servlet或JSP处理请求时,可以通过request对象获取到ServletContext对象,通过ServletContext对象获取到RequestDispatcher对象,然后通过RequestDispatcher对象的forward()方法将请求转发给另一个Servlet或JSP进行处理。 ## 重定向 重定向是指在客户端浏览器中发起一个新的请求,请求的URL地址指向另一个资源。在这个过程中,浏览器会向服务器发送两次请求,第一次请求是原始请求,第二次请求是重定向后的请求。 重定向的流程如下: 1. 浏览器向服务器发送请求。 2. 服务器接收到请求后,根据请求的URL地址找到对应的Servlet或JSP。 3. Servlet或JSP处理请求,生成响应结果。 4. Servlet或JSP将响应结果返回给浏览器,并在响应头中设置Location属性,指向另一个资源。 5. 浏览器收到响应后,根据Location属性的值向服务器发送另一个请求,请求的URL地址指向重定向后的资源。 6. 服务器接收到新的请求后,根据请求的URL地址找到对应的资源。 7. 最后,服务器将处理结果返回给浏览器。 重定向的原理是通过response对象的sendRedirect()方法实现。具体来说,当Servlet或JSP处理请求后,可以通过response对象的sendRedirect()方法设置Location属性,然后将响应结果返回给浏览器。浏览器收到响应后,会根据Location属性的值向服务器发送另一个请求,请求的URL地址指向重定向后的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值