赞
踩
C/S:Client / Server 客户端/服务器
B/S: Browser/Server 浏览器/服务器端
总结:B/S对C/S而言,B/S具有的优势。
静态资源:
动态资源:
服务器:安装了服务器软件的计算机。
服务器软件:接收用户的请求,处理请求,做出响应。
web服务器软件:接收用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。
Tomcat免费的Web服务器,该服务器支持全部JSP以及Servlet规范,也是我们学习javaweb所使用的服务器,所以我们有必要深入了解;
可以直接在官网下载:http://tomcat.apache.org/
解压压缩包即可。
注意:安装目录建议不要有中文和空格,解压的目录结构如下图
删除目录即可
bin/startup.bat
,双击运行该文件即可
访问:浏览器输入:http://localhost:8080 回车访问自己
http://别人的ip:8080 访问别人
显示如下界面表示成功
启动时可能遇到的问题:
黑窗口一闪而过:
端口号被占用:
暴力解决:找到占用的端口号,并且找到对应的进程,杀死该进程
netstat –ano|findstr [指定端口号]
找到占用端口的进程温柔解决:修改自身的端口号
在conf/server.xml 配置文件中修改
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8445" />
bin/shutdown.bat
ctrl+c
×
Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为项目部署(虚拟目录的映射)。
配置conf/server.xml
文件, 在<Host>
标签体中加入子标签配置
<!--<Context path="虚拟路径" docBase ="物理路径" />-->
<Context docBase="D:\hello" path="/xixi" />
docBase
:项目存放的路径
path
:虚拟目录
直接将项目放到webapps目录下即可
/hello
:项目的访问路径–>虚拟目录在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
<!--<Context docBase="虚拟路径"/> -->
<Context docBase="D:\hello" />
run -->Edit Configurations
±->Tomcat Server–>Local
Configure…,选取Tomcat文件路径,apply
Servlet是一门用于开发动态web资源的技术,它是运行在服务器端的小程序。
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则(抽象方法)。
作用:Servlet主要用于处理客户端传来的 HTTP请求,并返回一个响应,它能够处理的请求有 doGet() 和 doPost() 等方法。
用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
快速入门,用Servlet向浏览器输出“hello servlet”
1、创建Java web项目
2、定义一个类DemoSevlet,实现Servlet接口
public class DemoServlet implements Servlet
3、实现接口中的抽象方法
package com.blb.servlet import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletDemo01 implements Servlet { @Override // destory : 销毁 public void destory() { } @Override // ServletConfig : 配置信息 public ServletConfig getServletconfig() { return null; } @Override // getServletInfo : 获取Servlet的信息 public String getServletInfo() { return null; } @Override // Init : 初始化方法 public void Init(ServletConfig servletConfig) throws ServletException { System.out.println("初始化"); } @Override // Service : 处理请求的业务逻辑方法 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { // 向控制台输出一句话 System.out.println("Hello Servlet"); // 得到输出对象 PrintWriter out = res.getwriter(); // 向浏览器输出信息 out.write("Hello Servlet"); } }
4、在web.xml中配置Servlet
<!--配置Servlet --> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <!--给当前需要配置的servlet取名字--> <servlet-name>Demo01</servlet-name> <servlet-class>com.blb.servlet.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <!--写全类名--> <servlet-name>Demo01</servlet-name> <url-pattern>/Demo</url-pattern> </servlet-mapping> </web-app>
5、运行效果
分析 http://localhost:8080/javaweb_01/demo01
localhost:主机号;8080:端口号;javaweb_01:项目名称(在配置的时候可以选择不用);demo01:资源路径
执行原理:
<url-pattern>
标签体内容<servlet-class>
全类名1、Servlet被创建时:执行init方法,只执行一次
Servlet什么时候被创建?
<servlet>
标签下配置
<load-on-startup>
的值为负数<load-on-startup>
的值为0或正整数Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
2、提供服务:执行service方法,执行多次
service
方法都会被调用一次。3、被销毁:执行destroy方法,只执行一次
destroy
方法。destroy
方法在Servlet被销毁之前执行,一般用于释放资源创建一个Servlet,理解Servlet的生命周期。
package com.blb.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletDemo01 implements Servlet { @Override public void destroy() { System.out.println("我被销毁了!!"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig config) throws ServletException { System.out.println("我出生了...."); } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { // 向控制台输出一句话 System.out.println("Hello Servlet"); // 得到输出对象 PrintWriter out = res.getWriter(); // 向浏览器输出信息 out.write("Hello Servlet"); } }
Servlet3.0开始支持注解配置,通过WebServlet注解来实现映射,web.xml不再是必需的组件。
步骤:
@WebServlet
注解,进行配置:@WebServlet("资源路径")
下面是@WebServlet
的源码实现
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet { String name() default "";//相当于<Servlet-name> String[] value() default {};//代表urlPatterns()属性配置 String[] urlPatterns() default {};//相当于<url-pattern> int loadOnStartup() default -1;//相当于<load-on-startup> WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default ""; }
Servlet
– 接口 :抽象方法:必须要被实现类重写
|
GenericServlet
– 抽象类 :必须重写Servlet里面的抽象方法
|
HttpServlet
– 抽象类 doget dopost
GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
package com.blb.servlet; import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * Servlet第二种创建方式, * 继承 GenericServlet 方式 创建Servlet * */ @WebServlet("/demo02") public class ServletDemo02 extends GenericServlet{ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("继承 GenericServlet 方式 创建Servlet"); } }
HttpServlet:对http协议的一种封装,简化操作 (我们一般使用这个)
package com.blb.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 继承HttpServlet,创建Servlet * */ @WebServlet("/demo03") public class ServletDemo03 extends HttpServlet{ /** * 重写doGet方法,如果请求是get方式,执行该方法 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("接收到get请求......"); } /** * 重写doPost方法,如果请求是post方式,执行该方法 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("接收到post请求......"); } }
urlpartten:servlet访问路径
什么是协议:
HTTP概念:- Hyper Text Transfer Protocol 超文本传输协议
HTTP协议特点:
历史版本:
* 1.0:每一次请求响应都会建立新的连接
* 1.1:复用连接
http协议是一个重要的协议,他是贯穿整合B/S架构的核心协议。因此学习http协议的时候一定要从请求和响应两个角度思考。
注意方向性( 请求:浏览器 -> 服务器;响应:服务器 -> 浏览器 )
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送一个 HTTP 请求
一个完整的HTTP请求包括如下内容:
请求行:
请求方式 请求url 请求协议/版本
请求头:客户端浏览器告诉服务器一些信息
请求头名称: 请求头值
请求空行:
空行,就是用于分割POST请求的请求头,和请求体的。
请求体(正文):
封装POST请求消息的请求参数的
请求字符串格式
POST /servlet_demo/demo2 HTTP/1.1 请求行
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
Origin: http://localhost:8080
Connection: keep-alive
Referer: http://localhost:8080/servlet_demo/demo2.html //防盗链
Upgrade-Insecure-Requests: 1
username=wangcai
特点:
特点:
下面的表格比较了两种 HTTP 方法:GET 和 POST。
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
一个HTTP响应代表服务器向客户端回送的数据,它包括:
响应行:
组成:协议/版本、响应状态码、状态码描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
状态码都是3位数字
分类:
1xx
:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码2xx
:成功。代表:200
3xx
:重定向。代表:302(重定向)
,304(访问缓存)
4xx
:客户端错误。代表:404(请求路径没有对应的资源)
,405:请求方式没有对应的doXxx方法
5xx
:服务器端错误。代表:500(服务器内部出现异常)
响应头:
格式:头名称: 值
常见的响应头:
响应空行
响应体:传输的数据
响应字符串格式
HTTP/1.1 200 Accept-Ranges: bytes ETag: W/"309-1594050856290" Last-Modified: Mon, 06 Jul 2020 15:54:16 GMT Content-Type: text/html Content-Length: 309 Date: Mon, 06 Jul 2020 16:02:39 GMT <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>demo2</title> </head> <body> <form action="/servlet_demo/demo2" method="post"> 用户名: <input type="text" name = "username" /><br/> <input type="submit" value="提交" /> </form> </body> </html>
request对象和response对象的原理
request对象继承体系结构
ServletRequest
–接口
| 继承
HttpServletRequest
–接口
| 实现
org.apache.catalina.connector.RequestFacade
类(tomcat)
获取请求行数据
POST /servlet_demo/demo2 HTTP/1.1
方法:
1. 获取请求方式 : `String getMethod()`
2. 获取虚拟目录:`/servlet_demo`
* `String getContextPath()`
3. 获取Servlet路径:`/demo2`
* `String getServletPath()`
4. 获取get方式请求参数:`name=zhangsan`
* `String getQueryString()`
5. 获取请求URI:
* `String getRequestURI()`:`/servlet_demo/demo2`
* `StringBuffer getRequestURL()` : `http://localhost/servlet_demo/demo2`
6. 获取访问的客户端IP地址:
* String getRemoteAddr()
7.获取协议及版本
* String getProtocol()
获取请求头数据:
Enumeration<String> getHeaderNames()
创建Servlet分别调用方法获取请求行、请求头、请求体数据
获取请求行数据:
package com.blb.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * request获取请求行数据 * */ @WebServlet("/demo01") public class ServletDemo01 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取请求方式 String method = req.getMethod(); System.out.println(method); //获取虚拟目录 String path = req.getContextPath(); System.out.println(path); //获取Servlet的路径 String servletPath = req.getServletPath(); System.out.println(servletPath); //获取get方法请求参数 String parameter = req.getQueryString(); System.out.println(parameter); //返回资源的路径(项目名加虚拟路径) String uri = req.getRequestURI(); System.out.println(uri); //返回的是资源路径(但是是全路径,带有地址以及端口号) StringBuffer urlBuffer = req.getRequestURL(); System.out.println(urlBuffer); //获取访问的客户端IP地址 String ipPath = req.getRemoteAddr(); System.out.println(ipPath); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
获取请求头数据:
package com.blb.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * request获取请求头数据 * */ @WebServlet("/demo02") public class ServletDemo02 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //通过请求头的名称获取请求头的值 String value = req.getHeader("Cookie"); System.out.println(value); //获取所有请求头的名称 Enumeration<String> headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) { String string = (String) headerNames.nextElement(); System.out.println(string); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
盗版网站的视频链接全部都是由正版授权网站的资源。盗版网站这样不仅分了流量和钱。所以可以设计一个小型拦截器。
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
“正版” 检测判断:
package com.blb.servlet; 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(name = "demo03",urlPatterns = "/demo03") //@WebServlet("/demo03") public class ServletDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String head = req.getHeader("referer"); System.out.println(head); if (head!=null){ if (head.contains("day05")){ System.out.println("播放电影"); }else{ System.out.println("盗版可耻"); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
正版网页页面:
<%-- Created by IntelliJ IDEA. User: 86182 Date: 2021/11/10 Time: 14:04 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form> <%-- <input type="submit">--%> <%-- <input name="username">--%> <a href="http://localhost:8080/day05/demo03">看电影</a> </form> </body> </html>
如果在正版页面点击播放链接,则
盗版的页面:
<%-- Created by IntelliJ IDEA. User: 86182 Date: 2021/11/1 Time: 14:05 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="http://localhost:8080/day05/demo03">点击播放电影</a> </body> </html>
如果通过盗版页面点击链接,则
如果是在网址上通过直接输入对应链接网址,则会返回空
那么它的判断方式就是:通过识别跳转到链接的前一个网址的url是什么,它的网址url有没有和我规定的页面网址有相同的地方。
中文乱码问题:
解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
获取请求体数据:
package com.blb.servlet; 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.BufferedReader; import java.io.IOException; @WebServlet("/demo05") public class ServletDemo05 extends HttpServlet { // 只能用POST请求 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 读取字符流 BufferedReader reader = req.getReader(); // 读取数据 String line = null; while((line=reader.readLine())!=null){ System.out.println(line); } } }
index.jsp
<form action="demo05" method="post">
<input type="text" name="username" />
<input type="submit" />
</form>
下面的GET请求和POST请求基本上都一样,在Tomcat8之后,GET请求不需要自行设置编码格式,而POST请求需要加上
req.setCharacterEncoding("utf-8");
req.getParameter("") 根据参数名获取参数值
String username = req.getParameter("username");
package com.blb.servlet; 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("/demo06") public class ServletDemo06 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置编码格式 req.setCharacterEncoding("utf-8"); // req.getParameter("") 根据参数名获取参数值 String username = req.getParameter("username"); System.out.println("这是GET请求"); System.out.println(username); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置编码格式 req.setCharacterEncoding("utf-8"); // String getParameter(String name):根据参数名称获取参数值 String username = req.getParameter("username"); System.out.println("这是POST请求"); System.out.println(username); } }
index.jsp
<form action="demo06" method="get">
<input type="text" name="username" />
<input type="submit" />
</form>
像日常生活中网页的多项选项(checkbox),我们可以通过 getParameterValues 创建一个字符串数组得到我们选择的值
String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
package com.blb.servlet; 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("/demo07") public class ServletDemo07 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置编码格式 req.setCharacterEncoding("utf-8"); // String[] getParameterValues(String name):根据参数名称获取参数值的数组 String[] hobbies = req.getParameterValues("hobby"); for (String hobby:hobbies) { System.out.println(hobby); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
index.jsp
<form action="demo07" method="get">
<input type="text" name="username" />
<input type="checkbox" name="hobby" value="game" />游戏
<input type="checkbox" name="hobby" value="music" />音乐
<input type="checkbox" name="hobby" value="football" />足球
<input type="submit" />
</form>
Enumeration getParameterNames():获取所有请求的参数名称
package com.blb.servlet; 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; import java.util.Enumeration; @WebServlet("/demo08") public class ServletDemo08 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // Enumeration<String> getParameterNames():获取所有请求的参数名称 Enumeration<String> names = req.getParameterNames(); while(names.hasMoreElements()){ String name = names.nextElement(); System.out.println(name); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
index.jsp
<form action="demo08" method="get">
<input type="text" name="username" />
<input type="checkbox" name="hobby" value="game" />游戏
<input type="checkbox" name="hobby" value="music" />音乐
<input type="checkbox" name="hobby" value="football" />足球
<input type="submit" />
</form>
一种在服务器内部的资源跳转方式
请求转发和重定向的区别主要在于路径上的变化(后面细讲!)
步骤
RequestDispatcher getRequestDispatcher(String path)
forward(ServletRequest request, ServletResponse response)
特点:
请求转发的应用场景:MVC设计模式
早期开发,前后端不分离
jsp 不是html 一点都不一样, jsp (视图层的servlet) --> servlet(控制层) MVC设计模式 Model(实体类 dao) View(html) Controller(servlet
package com.blb.servlet; import javax.servlet.RequestDispatcher; 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("/servlet01") public class DemoServlet01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("servlet01"); // 前一部分是获取转发对象,以及转发地址 RequestDispatcher requ = req.getRequestDispatcher("/index.jsp"); // 第二部分 requ.forward(req, resp); } }
通过请求转发来实现登录页面的切换:
package com.blb.servlet; import javax.servlet.RequestDispatcher; 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("/servlet01") public class DemoServlet01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); if (username.equals("admin") && password.equals("123456")){ // 请求转发 RequestDispatcher requ1 = req.getRequestDispatcher("/login.jsp"); requ1.forward(req,resp); //或者 req.getRequestDispatcher("/login.jsp").forward(req, resp); }else { RequestDispatcher requ1 = req.getRequestDispatcher("/fail.jsp"); requ1.forward(req,resp); //或者 req.getRequestDispatcher("/fail.jsp").forward(req, resp); } } }
首页 index.jsp
<%-- Created by IntelliJ IDEA. User: 86182 Date: 2021/11/17 Time: 14:13 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="servlet01"> 账号: <input type="text" name="username"><br> 密码: <input type="password" name="password"> <input type="submit"> </form> </body> </html>
登陆成功页面 login.jsp
<%-- Created by IntelliJ IDEA. User: 86182 Date: 2021/11/17 Time: 14:27 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>login</title> </head> <body> 登录成功 </body> </html>
登陆失败页面 fail.jsp
<%-- Created by IntelliJ IDEA. User: 86182 Date: 2021/11/17 Time: 14:27 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>failed</title> </head> <body> 登陆失败 </body> </html>
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
void setAttribute(String name,Object obj)
:存储数据Object getAttitude(String name)
:通过键获取值void removeAttribute(String name)
:通过键移除键值对实例:第一个class存储数据,第二个class取数据并删除数据,第三个class再取数据
DemoServlet01:
package com.blb.servlet; import javax.servlet.RequestDispatcher; 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("/servlet01") public class DemoServlet01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("a", "zya"); System.out.println(req.getAttribute("a")); req.getRequestDispatcher("/servlet02").forward(req, resp); } }
DemoServlet02:
package com.blb.servlet; import com.sun.org.apache.xpath.internal.objects.XObject; 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("/servlet02") public class DemoServlet02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Object b = req.getAttribute("a"); System.out.println(b); req.removeAttribute("a"); req.getRequestDispatcher("/servlet03").forward(req, resp); } }
DemoServlet03:
package com.blb.servlet; 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("/servlet03") public class DemoServlet03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取存储的数据(通过键值对的方式) System.out.println(req.getAttribute("a")); } }
打印的结果为
设置响应行
HTTP/1.1 200
设置状态码:setStatus(int sc)
设置响应头
setHeader(String name, String value)
步骤:
PrintWriter out= response.getWriter();
out.write(数据);
乱码问题:
PrintWriter out= response.getWriter();
获取的流的默认编码是ISO-8859-1
告诉浏览器响应体使用的编码和响应的数据类型:response.setContentType("text/html;charset=utf-8");
package com.blb.servlet; 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; import java.io.PrintWriter; @WebServlet("/ResponseDemo") public class ResponseDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置状态码(302代表重定向) resp.setStatus(302); // setHeader(String name, String value) // 设置编码格式 resp.setHeader("Content-Type", "text/html;charset=utf-8"); // resp.setCharacterEncoding("gbk"); // response浏览器输出 // 获取IO流 PrintWriter pw = resp.getWriter(); pw.write("hello world世界"); } }
资源跳转的方式
response.sendRedirect(跳转地址);
resp.setStatus(302) 和 resp.setHeader("location", "跳转地址")
(这种方法用的少)package com.blb.servlet; 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("/Response01") public class ResponseDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setStatus(302); // resp.setHeader("location", "https://www.baidu.com"); resp.sendRedirect("https://www.baidu.com"); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。