Servlet跳转(forward、Redirect )

Servlet笔记系列(4):Servlet跳转(forward、Redirect )

 发表于 2014-12-04 |  分类于 Servlet |  阅读次数: 11

转发 Forward

Api 详解

  1. 转发 Forward 是通过 RequestDispatcher 对象的 forward()方法实现。RequestDispatcher 可以通过以下两种方式获取:
    1. HttpServletRequest 的 getRequestDispatcher() 方法获得
    1. ServletContext 的 getRequestDispatcher() 方法获取
1
2
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/downloadServlet");
RequestDispatcher dispatcher = req.getRequestDispatcher("/downloadServlet");
  1. getRequestDispatcher() 方法的参数必须为以 / 开始, / 表示本 Web 应用程序的根路径。如果要跳转到Servlet为 http://IP:PORT/servlet/RequestServlet。则参数应该为 /servlet/RequestServlet

  2. 跳转在服务器,地址栏不变。当使用 Forward 形式跳转 Servlet 时,地址栏会显示跳转前的 Servlet 访问地址。因为该跳转是在服务器端实现,客户端浏览器并不知道该跳转动作,也就是说 Forward 跳转对客户端浏览器是透明的

  3. Forward是最常用的方式。在struts等框架中,都是用Servlet来处理用户请求,把结果通过 request.setAttribute() 放到 request 中,然后 Forward 到JSP显示

  4. 当执行 Forward 动作的时候不能有任何输出到达客户端,否则会抛出 illegalStateException

1
java.lang.IllegalStateException: Cannot forward after response has been committed
  1. 转发:同一个HttpServletRequest, 这时web 数据的共享要使用 Request 域即可

  2. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ForwardServlet extends HttpServlet {

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

        PrintWriter writer = resp.getWriter();
        writer.write("在 Forward 之前不能向客户端输出结果");
        writer.flush();


        // 跳转到文件下载的 Servlet
        // RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/downloadServlet")
        RequestDispatcher dispatcher = req.getRequestDispatcher("/downloadServlet");
        dispatcher.forward(req, resp);
    }
}

重定向 Redirect

原理

  1. 重定向是利用服务器返回的状态来实现的。客户端浏览器请求服务器的时候,服务器端会返回一个状态码。服务器端通过 HttpServletResponse 的 setStatus()方式设置状态码。如果服务器返回301 或者 302,则浏览器会到新的网址重新请求该资源。状态码的意思如下
    —|—
    100 ~ 199 | 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
    200 ~ 299 | 表示成功接收请求,已经完成整个过程。如200
    300 ~ 399 | 为完成请求,客户端需要进一步细化请求。例如,请求的资源已经移动到一个新的地址。常用 301、302、307、304
    400 ~ 499 | 客户端的请求有错误。常用404
    500 ~ 599 | 服务器端出现错误。常用500

  2. 301 、302都表示重定向,区别是 301是永久性重定向,302是临时性重定向。下面的代码将访问该Servlet的请求重定向到另一个网址

1
2
response.setStates(301);//设置状态码为301
response.setHeader("Location","http://www.baidu.com") //新网址

实现

  1. HttpServletResponse 类中把重用的状态码封装成了静态常量。并且把setStates() 与 setHeader() 方法封装成另一个方法 sendRedirect(String location),只需要调用 sendRedirect() 方法就能实现重定向

  2. 与转发不同,重定向(Redirect)的跳转是在客户端实现的。实际上客户端浏览器请求了 2 次服务器,第1 次获取重定向的状态码与重定向的网址,第 2 次访问真实地址

  3. 重定向:是不同的 HttpServletRequest 对象,每一次访问都会new 一个 HttpServletRequest 对象。这时web数据的共享要使用 session 域 和 context 域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class RedirectServlet extends HttpServlet {

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

        // 重定向到文件下载页面
        resp.setStatus(301);
        resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        resp.setHeader("Location", "/requestServlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/requestServlet");
    }
}

自动刷新(Refresh)

  1. 自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后刷新本页面。Servlet中通过设置HttpServletResponse 对象的Header属性实现自动刷新效果
  • 其中 1000 为时间,单位为毫秒
  • URL参数指定的网址就是1 秒之后跳转的页面。当URL设置的路径为Servlet自己的路径时,就会每隔1秒钟自动访问页面一次
1
response.setHeader("Refresh","1000; url=http://www.baidu.com")
  1. 自动刷新与重定向原理是差不多。如果时间设为 0,把URL设为另一个网址,效果就是重定向
1
response.setHeader("Refresh","0; url=http://www.baidu.com") // 重定向
### 部署 Stable Diffusion 的准备工作 为了成功部署 Stable Diffusion,在本地环境中需完成几个关键准备事项。确保安装了 Python 和 Git 工具,因为这些对于获取源码和管理依赖项至关重要。 #### 安装必要的软件包和支持库 建议创建一个新的虚拟环境来隔离项目的依赖关系。这可以通过 Anaconda 或者 venv 实现: ```bash conda create -n sd python=3.9 conda activate sd ``` 或者使用 `venv`: ```bash python -m venv sd-env source sd-env/bin/activate # Unix or macOS sd-env\Scripts\activate # Windows ``` ### 下载预训练模型 Stable Diffusion 要求有预先训练好的模型权重文件以便能够正常工作。可以从官方资源或者其他可信赖的地方获得这些权重文件[^2]。 ### 获取并配置项目代码 接着要做的就是把最新的 Stable Diffusion WebUI 版本拉取下来。在命令行工具里执行如下指令可以实现这一点;这里假设目标路径为桌面下的特定位置[^3]: ```bash git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git ~/Desktop/stable-diffusion-webui cd ~/Desktop/stable-diffusion-webui ``` ### 设置 GPU 支持 (如果适用) 当打算利用 NVIDIA 显卡加速推理速度时,则需要确认 PyTorch 及 CUDA 是否已经正确设置好。下面这段简单的测试脚本可以帮助验证这一情况[^4]: ```python import torch print(f"Torch version: {torch.__version__}") if torch.cuda.is_available(): print("CUDA is available!") else: print("No CUDA detected.") ``` 一旦上述步骤都顺利完成之后,就可以按照具体文档中的指导进一步操作,比如调整参数、启动服务端口等等。整个过程中遇到任何疑问都可以查阅相关资料或社区支持寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值