4、HttpServlet的Response、转发、重定向、页面跳转到方式

1、Response(响应)概述

服务器(Servlet) -> 客户端  set方法
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应⾏,响应头和响应体

在这里插入图片描述

2、设置响应行

  响应状态码:服务器告诉客户端浏览器本次请求和响应的⼀个状态。
  
1. 1xx:服务器就收客户端消息,但没有接受完成,等待⼀段时间后,发送1xx多状态码
2. 2xx:成功。代表:200
3. 3xx:重定向。代表:302(重定向),304(访问缓存)
4. 4xx:客户端错误。

代表:
404(请求路径没有对应的资源)
405:请求⽅式没有对应的doXxx⽅法
6. 服务器端错误。代表:500(服务器内部出现异常)

== 设置响应⾏的状态码
setStatus(int sc) ==

3、设置响应头

        String getHeader(name) - request
        setHeader(name, value)
        addHeader(name, value)
package e_response;

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;

@WebServlet("/Demo08Servlet")
public class Demo08Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        // 设置响应头 - 相同的name, 将value覆盖
        resp.setHeader("username","zhangsan");
        // 添加响应头 - 相同的name可以同时存在
        resp.addHeader("username","张三");
        resp.setIntHeader("age",18);
        System.out.println("Demo8Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

4、设置响应体

4.1 响应体设置⽂本

PrintWriter getWriter()

获得字符流,通过字符流的write(String s)⽅法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

4.2 响应头设置字节

ServletOutputStream getOutputStream()

获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写⼊字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。

5、 重定向

== 重定向:资源跳转的⽅式 ==

在这里插入图片描述

代码实现:

//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//简单的重定向⽅法
response.sendRedirect("/day15/responseDemo2");
package e_response;

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;

// 重定向
@WebServlet("/Demo09Servlet")
public class Demo09Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo9Servlet");
        // 1.设置状态码为302
        //resp.setStatus(302);
        // 2.设置路径, location-固定, value-客户端路径
        //resp.setHeader("location", "/day03_war_exploded/Demo08Servlet");

        // 重定向
        resp.sendRedirect(req.getContextPath()+"/Demo08Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

访问的demo8,跳转到07

在这里插入图片描述

6、请求转发

请求转发:⼀种在服务器内部的资源跳转⽅式

6.1 步骤:

2. 通过request对象获取请求转发器对象:
3. RequestDispatcher
getRequestDispatcher(String path)
4. 使⽤RequestDispatcher对象来进⾏转发:forward(ServletRequest request,ServletResponse response)

6.2 特点:

6. 浏览器地址栏路径不发⽣变化
7. 只能转发到当前服务器内部资源中
8. 转发是⼀次请求

在这里插入图片描述

package a_request;

import javax.servlet.ServletContext;
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;

@WebServlet("/Demo06Servlet")
public class Demo06Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = req.getServletContext();
        context.getContextPath();
        req.getContextPath(); // 来获得应用名
        // request 作为域对象使用
        req.setAttribute("user", "张三");
        System.out.println("Demo06存进去了数据");
        // 请求转发 - Demo07Servlet
        req.getRequestDispatcher("/Demo07Servlet")
                .forward(req, resp);
        // 下面不要写代码了
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
package a_request;

import javax.servlet.ServletContext;
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;

@WebServlet("/Demo07Servlet")
public class Demo07Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = (String) req.getAttribute("user");
        System.out.println("Demo7  " + user);
        // 可以给客户端响应 或者再次转发出去
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

7、 共享数据

域对象:⼀个有作⽤范围的对象,可以在范围内共享数据
request域:代表⼀次请求的范围,⼀般⽤于请求转发的多个资源中共享数据
⽅法:

void setAttribute(String name,Object obj):存储数据
Object getAttitude(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对

== 注意:ServletContext域与Request域的⽣命周期⽐较?==

	ServletContext
	创建:服务器启动
	销毁:服务器关闭
	域的作⽤范围:整个web应⽤
	
request
创建:访问时创建request
销毁:响应结束request销毁
域的作⽤范围:⼀次请求中

8、路径写法

 相对路径:通过相对路径不可以确定唯⼀资源

绝对路径:通过绝对路径可以确定唯⼀资源	

如:http://localhost/day15/responseDemo2 /day15/responseDemo2
以 / 开头的路径

给客户端浏览器使⽤:需要加虚拟⽬录(项⽬的访问路径)
== 建议虚拟⽬录动态获取:request.getContextPath()==

9、总结:javaee页面跳转的方式

服务器端:
	 1.转发:  1次请求, 地址栏不变, 服务器内部行为(提供服务器端路径)
	 2.重定向:2次请求, 地址栏改变, 服务器和客户端之间的行为(提供客户端路径)
 客户端:
	 3.超链接
	 4.表单提交
	 5.直接地址栏访问
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
好的,以下是JavaWeb代码实现1、2、3的示例: 1. 实现登录功能: LoginServlet.java ```java public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取用户输入的用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); // 从数据库中查询用户信息 User user = UserDao.getUser(username, password); if (user != null) { // 登录成功,将用户信息存储到session中 HttpSession session = request.getSession(); session.setAttribute("user", user); // 使用定向到登录成功页面 response.sendRedirect(request.getContextPath() + "/success.jsp"); } else { // 登录失败,返回登录页面并提示错误信息 request.setAttribute("message", "用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } } ``` 2. 实现注销登录功能: LogoutServlet.java ```java public class LogoutServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 删除session中的用户信息 HttpSession session = request.getSession(); session.removeAttribute("user"); // 使用定向到登录页面 response.sendRedirect(request.getContextPath() + "/login.jsp"); } } ``` 3. 实现页面拦截功能: LoginFilter.java ```java public class LoginFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; // 判断用户是否已经登录 HttpSession session = req.getSession(); User user = (User) session.getAttribute("user"); if (user == null) { // 用户未登录,定向到登录页面 resp.sendRedirect(req.getContextPath() + "/login.jsp"); } else { // 用户已登录,放行 chain.doFilter(request, response); } } public void destroy() { } } ``` 在web.xml文件中配置LoginFilter: ```xml <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.example.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping> ``` 以上代码仅供参考,具体实现还需要根据具体的业务需求进行适当修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值