- Link狂神说
- Link楠哥
- 1、基本概念
- 2、web服务器
- 3.Tomcat
- 4、Servlet
- 5、JSP
- 简述
- 本质
- JSP内置对象
- request常用方法
- 1、String getParameter( String ); //获取请求参数(浏览器—>服务端)
- 2、void setAttribute(String key,Object value) //通过键值对来保存数据(服务端A—>服务端B)
- 3、void getAttribute(String key) //通过key来取出value
- 4、RequestDispatcher getRequestDispatcher(String path) //返回一个RequestDispatcher对象,该对象的forward方法用于转发请求
- 5、String[ ] getParameterValues() //获取客户端传来的多个同名参数
- 6、void setCharacterEncoding(String charset) //指定每个请求的编码
- Http请求状态码
- response常用方法(有杂音)
- request常用方法
Link狂神说
这是课代表的Javaweb笔记:
https://blog.csdn.net/qq_36188127/article/details/109370717
Link楠哥
https://pan.baidu.com/s/1MDbbNKqC5mgUGg2yUiM9cg 提取码: zmpi
p30:源码和静态资源
链接:https://pan.baidu.com/s/1uod9b5enrMK1r9t3yqHROA
提取码:ro6p
—来自百度网盘超级会员V4的分享
1、基本概念
1.1、前言
Java Web即web开发,web就是网页的意思。包括静态网页和动态网页,即静态web和动态web。
- 静态web
- html,css
- 提供给所有人看的数据都不会发生变化
- 动态web
- 几乎所有的网站
- 个性化显示页面
- 技术栈:Servlet/JSP,ASP,PHP
在Java中,动态web资源开发的技术称为JavaWeb。
1.2、web应用程序
本义就是可以提供浏览器访问的程序。比如xxx.html,多个这样的文件组成的web资源可被外界访问,对外界提供服务。这个统一的web资源会被放在同一个文件夹下,这个文件夹就是web应用程序即Tomcat服务器。一个web应用程序由多部份组成,比如:
- html,css,js
- jsp,servlet
- java程序包
- jar包
- 配置文件
web应用程序编写完毕,若想提供给外界访问,则需要一个服务器来统一管理。
1.3、静态web
- .html,.htm这些都是网页后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。
- 静态web存在的缺点:
- web页面无法动态更新,所有用户看到的都是同一个页面
- 轮播图,点击特效:伪动态
- js,动态效果
- VBScript,动态效果
- 它无法和数据库交互(意味着数据无法持久化,用户无法交互)
- web页面无法动态更新,所有用户看到的都是同一个页面
1.4、动态web
动态展示会因人而异。 
缺点
- 加入服务器的动态web资源出现了错误,我们需要重新编写后台程序并重新发布;
优点
- web页面可以动态更新,所有用户看到的都不是同一个页面
-
2、web服务器
2.1、技术解读
ASP,JSP,PHP
ASP:是微软开发的服务器,它是在HTML中嵌入了VB脚本,ASP+COM,基本每个页面都有几千行的业务代码, 页面极其混乱。
PHP:开发速度快,功能很强大,跨平台,代码简单,但无法承载大量访问的情况
JSP/Servlet:
B/S:浏览器、服务器架构
C/S:客户端和服务器架构 Sun公司主推的B/S架构
- 基于Java语言
- 可承载三高:高并发、高可用、高性能
- 语法像ASP,ASP->JSP,加强市场强度。
2.2、web服务器
服务器是一种被动操作,用来处理用户的一些请求和给用户响应一些信息。常见的包括Tomcat、Jboos、Weblogin、Jetty等。
Tomcat因为技术先进、性能稳定而且免费,所以深受Java爱好者的喜欢。Tomcat实际上运行JSP页面和Servlet。工作3-5年之后,可以尝试手写Tomcat服务器。
3.Tomcat
3.1、 安装 Tomcat
Tomcat官网:http://tomcat.apache.org/
3.2、 Tomcat 启动和配置
文件夹:

注:temp文件就是上传下载用的,webapps是存放客户端能访问到的资源,而work是存放tomcat将JSP转换之后的Servlet文件。
启动和关闭 Tomcat
可能遇到的问题
- Java 环境变量没有配置导致闪退(需配置兼容性)
-
3.3、 配置
核心配置
服务器核心配置文件目录如下:

可以配置启动的端口号 tomcat的默认端口号为:8080
- mysql:3306
- http:80
https:443
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" /> 123
可配置主机名称
默认的主机名为:localhost->127.0.0.1
- 默认网站应用存放的位置为:webapps
<Host name="www.qinjiang.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
面试题:网站访问过程
- 在浏览器输入一个域名,回车;
- 本机查看 C:\Windows\System32\drivers\etc\hosts 配置文件是否有相应域名的映射。
case1: 若有,则直接映射到对应的 IP 地址,进行访问。
case2: 若无,则去 DNS 服务器上查找对应的 IP ,找到就返回相应的 IP,找不到就不返回。
3.4、 发布一个 Web 网站
网站程序的结构:
--webapps :Tomcat服务器的web目录-ROOT-kuangstudy :网站的目录名- WEB-INF-classes : java程序-lib:web应用所依赖的jar包-web.xml :网站配置文件- index.html 默认的首页- static-css-style.css-js-img-.....
本质上,我们可以通过…apache-tomcat-10.0.12\bin下的bin目录中的启停命令来开启服务器,然后将需要给客户展示的资源存放到webapps目录中,通过一些映射机制,使客户键入准确域名、ip和应用名时能看到想要看到的效果。然而,这样存在一个问题,就是当所部署的文件需要大量、多次修改时,以上操作并不明智。因此,这个问题的解决可以是IDEA集成Tomcat:
- 创建一个Java Web工程

- Java Web应用组件展示

具体做法:
首先,我们再index.jsp文件中写一个标签:
<!DOCTYPE html><html><head><title>我的标题</title></head><body><h1>等等我,夫人</h1></body></html>
但此时并不能直接被浏览器访问到,因为还没有部署到应用中。在IDEA中的Tomcat添加方式是:

但其实,光添加了Tomcat还不行,我们只有服务器,用户就只能访问到服务器。用户想要访问我们所显示的页面怎么办?就需要部署目录了,即把我们自己写的工程打包放到Tomcat服务器中,放到如下:
点击启动,效果如下:
找到应用的三要素:域名+IP+应用名
4、Servlet
Servlet是Java Web开发的基石,与平台无关的服务器组件,它是运行在Servlet容器(或者叫Web应用服务器,这里也即是Tomcat),负责与客户端进行通信。
Servlet有2个功能,创建并返回基于客户端请求的动态HTML页面(根据选择动态返回不同页面)以及与数据库进行通信,是一个类似桥梁的作用。
Servlet本身是一组接口,位于javax.servlet包下。使用时自定义一个类实现Servlet接口,这样的类就具备了接受客户端请求并作出相应的功能。
我们在src下写了个MyServlet类实现了Servlet接口,但是与index.jsp不同,用户并不能直接访问到,因为,用户访问的数据实际上是在target目录下,如果浏览器地址栏直接键入localhost:8080/mt/,实际上就是默认打开该目录下的index.jsp页面。对于外部访问来说,web-inf下的文件都是不可见的(即不能通过url获得web-info下的任何文件),所以,直接访问jsp是不可能的。
package com.example.mytomcat001;import javax.servlet.*;import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init method...");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method...");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("destory method...");}}
因此,正由于浏览器不能直接访问Servlet文件,只能通过映射的方式间接访问Servlet,映射需要开发者手动配置,有两种配置方式:
xml映射的方式
通过在src目录下的WEB-INF下的web.xml配置Java文件的映射,注意只是针对Java文件。如下:


<?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-name>MyServlet</servlet-name><servlet-class>com.simon.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/myservlet</url-pattern></servlet-mapping></web-app>注意:这里<servlet>是Java文件的全类名以及简称,这个简称是为了与下面的映射Servlet即<servlet-mapping>一致。而<servlet-mapping>servlet映射是用户所要输入的应用名。这样就保护了真正的Java文件不被发现而修改,却还能被访问到。还有一点,当IDEA启动以后,浏览器默认的打开页面实际上是web目录。如果需要指定页面,就需要手动输入更具体的应用。
对用户的响应如下:
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method...");servletResponse.setContentType("text/html;charset=UTF-8");servletResponse.getWriter().println("你好,这是我对你的响应");}
有个疑问
既然WEB-INF目录是不可访问的,那么当用户键入http://localhost:8080/eedemo_war_exploded/myservlet时,为什么可以通过WEB-INF/web.xml来访问到我写的Java类?
注解的方式
只需要在需要被访问类的头上加上注解,参数就是用户访问的应用名。
标准代码块A
package com.simon;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import java.io.IOException;@WebServlet("/myservlet")public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init method...");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method...");servletResponse.setContentType("text/html;charset=UTF-8");servletResponse.getWriter().println("你好,这是我对你的响应");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("destory method...");}}
上述两种配置方式结果完全一致,将myservlet与MyServlet全类名进行映射,即在浏览器的地址栏中间接访问demo就可以映射到MyServlet。
Servlet的生命周期
原理
参考标准代码块A,思考:我们如何调用service()方法的?MyServlet有没有创建对象?如果没有创建对象,那么它是如何调用MyServlet类中的方法的?
其实,答案就在Servlet的映射方式里。以xml映射方式为例,/myservlet需要映射的是MyServlet的全类名,这个全类名可以通过反射读取到构造器,它通过构造器创建对象,通过对象再去调用service方法,进而显示出来。
下面来证明这个答案是正确的:
- 首先编写一个无参构造器,就是用来创建对象。既然是实例方法,那么无参构造器肯定是先执行
- 执行完后再根据生命周期执行接下来的初始化、业务方法、销毁方法。当然业务方法可以执行多次。 ```java package com.simon;
import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException;
@WebServlet(“/myservlet”) public class MyServlet implements Servlet {
public MyServlet(){System.out.println("创建了Servlet对象");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init method...");}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method...");servletResponse.setContentType("text/html;charset=UTF-8");servletResponse.getWriter().println("你好,这是我对你的响应");}@Overridepublic void destroy() {System.out.println("destory method...");}
}
<a name="tpaUs"></a>### 步骤- 当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例化对象是否存在,如果存在,直接执行第三步;如果不存在,就通过反射机制动态创建对象。- 调用init方法完成初始化操作,这些操作包括写死用户名、密码,这样就可以不用去数据库中找;- 调用service方法完成业务逻辑操作- 关闭Tomcat时,会调用destory()方法,释放当前对象占用的资源。<a name="s6FJE"></a>## 关于Servlet接口```javapublic interface Servlet {void init(ServletConfig var1) throws ServletException;ServletConfig getServletConfig();void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;String getServletInfo();void destroy();}
其中,ServletConfig是Servlet的基础配置信息相关的接口:
public interface ServletConfig {String getServletName();//返回Servlet的全类名ServletContext getServletContext();//非常重要,重中之重String getInitParameter(String var1);//实际上是读取xml映射方式中init-parameter的参数Enumeration<String> getInitParameterNames();//取key-value的keySet,无序}
<?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"><context-param><param-name>username</param-name><param-value>all</param-value></context-param><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.simon.MyServlet</servlet-class><init-param><param-name>username</param-name><param-value>admin</param-value></init-param><init-param><param-name>password</param-name><param-value>123456</param-value></init-param></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/myservlet</url-pattern></servlet-mapping></web-app>
package com.simon;import javax.servlet.*;import java.io.IOException;import java.util.Enumeration;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {String sn = servletConfig.getServletName();System.out.println(sn); //com.simon.MyServlet//注意:这个参数是程序初始化的时候我们在xml映射文件中指定的参数//有啥用?可做校验String username = servletConfig.getInitParameter("username");System.out.println(username); //adminEnumeration<String> ipns = servletConfig.getInitParameterNames();while (ipns.hasMoreElements()){String s = ipns.nextElement();System.out.println(s);//password username,无序集合}//返回ServletContext对象,他是Servlet的上下文,整个Servlet的管理者,通过它可以拿到Servlet的所有信息ServletContext sc = servletConfig.getServletContext();String scn = sc.getServletContextName();System.out.println(scn); //null,当前应用的名称,在部署根目录下String cp = sc.getContextPath();System.out.println(cp); //eedemo_war_exploded,部署根目录的路径,即初始显示在哪String si = sc.getServerInfo();System.out.println(si); //Apache Tomcat/8.5.37,服务器信息String un = sc.getInitParameter("username");System.out.println(un); //all}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method...");servletResponse.setContentType("text/html;charset=UTF-8");servletResponse.getWriter().println("你好,这是我对你的响应");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}}
关于ServletConfig与ServletContext的区别
ServletConfig作用于某个Servlet实例,每个Servlet都有对应的ServletConfig;ServletContext作用于整个Web应用,一个Web应用对应于一个ServletContext,多个Servlet实例对应一个ServletContext。总之,可以理解为一个全局对象,一个局部对象。
Servlet的层次结构
Servlet是最顶层的抽象接口,我们日常开发中使用最多的是HttpServlet类,体系是:Servlet—>GenericServlet—>HttpServlet,Http请求类型有很多种,常用四种:
- GET
- POST
- PUT
- DELETE
由于日常业务也就是增删改查,这四种请求分别是读取、保存、修改、删除,恰好满足日常开发所需请求。
package com.example.mytomcat001;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("/hs")public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("my httpServlet...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}}
这里HttpServlet相对于Servlet的好处:
①省去了大量不必要重写的方法,比如init()、getServletConfig()、getServletInfo()、destroy()
②由于使用最多的是service()方法,具体到HttpServlet类,将service方法又具体进一步拆解,子类可根据请求方式的不同继承自己需要的方法,颗粒度更细。
由于我们在地址栏输入的请求是属于Get请求,并且是使用频率最高的一种请求了。实际上,日常开发中为了便于模拟请求,我们可以用Postman工具来模仿客户端发送请求。
(https://zhuanlan.zhihu.com/p/30266849)接口文档管理工具。
模拟HttpServlet的实现过程
总的思路就是,GenericServlet实现了Servlet接口,同时为它的子类屏蔽了不常用的方法,子类只需要重写service方法即可。HttpServlet继承GenericServlet,根据请求类型进行分发处理,Get进入DoGet方法,Post进入doPost方法,开发者自定义的Servlet类只需要继承HttpServlet即可,重写doGet和doPost。
第一层,实现Servlet接口
package com.example.achServlet;import javax.servlet.*;import java.io.IOException;public class MyGenericServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}}
第二层,只继承父类的service方法
package com.example.achServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;//通过继承的方式,把我们不需要的四个父类方法全部屏蔽掉了public class MyHttpServlet extends MyGenericServlet{@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;//获取请求类型//可以通过打断点方式,知道请求方式有get、put、delete、post等String method = request.getMethod();//根据请求类型完成分发switch (method){case "Get":this.doGet(request,response);break;case "Post":this.doPost(request,response);break;}}public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {}public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {}}
第三层,实现自定义业务
package com.example.achServlet;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/test")public class MyTestServlet extends MyHttpServlet{@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.getWriter().write("TestGet");}@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {response.getWriter().write("TestPost");}}
5、JSP
简述
在做开发中,有两个组件非常重要,一个Servlet,一个JSP。
JSP本质上就是一个Servlet。JSP主要负责与用户交互,将最终的页面呈现给用户,是HTML+JS+CSS+JAVA的混合文件。

如果要显示一个“Hello,World”的页面,用Servlet方式如上,但是这样做代码显得非常繁杂,并不实际。正是由于这样的需求,导致JSP的诞生。下面截图是JSP转成Servlet的方法:
本质
本质上,我们通过JSP能看到页面的原因是,JSP并不是HTML代码,我们只是把HTML代码写到JSP文件里,最终把JSP转成Servlet,Servlet再通过它的write方法把HTML写好的代码一行一行输出,最终看到结果。虽然我们在index.jsp同级目录下随便写一个a.html,客户端也能访问到,但这并不意味着HTML的胜利,因为HTML并不能写Java代码,也就意味着不能传输数据。所以,JSP是不可被替代的。
当服务器接到一个后缀是jsp的请求时,将该请求交给jsp引擎去处理,每一个jsp页面第一次被访问的时候,jsp引擎会将其翻译成一个Servlet文件,由Web容器来调用Servlet完成响应。单纯从开发角度讲,JSP就是在HTML中嵌入Java程序。具体的嵌入方式有三种:
1、JSP脚本
执行Java逻辑代码。
<% Java代码 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%String name = "Hello,World!";System.out.println(name);%></body></html>
2、JSP声明
定义Java方法。
<% !声明 Java方法%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%!public String test(){return "HelloWorld";}%><%test();%></body></html>
3、JSP表达式
把Java对象直接输出到HTML页面中。
< % = Java 变量 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%!public String test(){return "HelloWorld";}%><%String str = test();%><%=str%></body></html>
JSP内置对象
9个。对应常见数据类型:
- request 表示一次请求,由HttpServletRequest产生
- response 表示一次响应,由HttpServletResponse产生
- pageContext 页面上下文,获取页面信息,来自PageContext类
- session 表示一次会话,保存用户信息,HTTPSession。例如打一次电话(可有多个request和response)
- application 表示当前Web应用,全局对象,保存所有用户共享信息,来自ServletContext类
- config 当前JSP对应的Servlet的ServletConfig对象,获取当前Servlet的信息。
- out 来自JspWriter类,向浏览器输出数据
- page 当前JSP对应的Servlet对象,Servlet
- exception 表示JSP页面发生的异常
常用的是:request、response、session、application、pageContext
request常用方法
1、String getParameter( String ); //获取请求参数(浏览器—>服务端)
package com.example.exer;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String id = req.getParameter("id");int i = Integer.parseInt(id);System.out.println(i);}}
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%String id = request.getParameter("id");%>><%=id%></body></html>
2、void setAttribute(String key,Object value) //通过键值对来保存数据(服务端A—>服务端B)
3、void getAttribute(String key) //通过key来取出value
传递参数为:localhost:8080/test1.jsp?id=1
//test1.jsp文件<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%String idStr = request.getParameter("id");int id = Integer.parseInt(idStr);id++;//将数据存入request中request.setAttribute("number",id);//将请求转发给test2.jsprequest.getRequestDispatcher("test2.jsp").forward(request,response);%><%=id%></body></html>
//test2.jsp文件<%--Created by IntelliJ IDEA.User: SimonDate: 2021/11/4Time: 14:53To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%Integer number = (Integer) request.getAttribute("number");System.out.println(number); //2%></body></html>
4、RequestDispatcher getRequestDispatcher(String path) //返回一个RequestDispatcher对象,该对象的forward方法用于转发请求
5、String[ ] getParameterValues() //获取客户端传来的多个同名参数
请求参数是:localhost:8080/test1.jsp?name=zs&name=ls&name=ww
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%request.setCharacterEncoding("UTF-8");String[] names = request.getParameterValues("names");%>><%=Arrays.toString(names)%> //[zs,ls,ww]</body></html>
6、void setCharacterEncoding(String charset) //指定每个请求的编码
Http请求状态码
- 200 正常
- 404 资源找不到
- 400 请求类型不匹配
- 500 Java程序抛出异常
response常用方法(有杂音)
1、sendRedirect(String path) //重定向
与RequestDispatcher getRequestDispatcher(String path) 类似,都是将数据从一个页面传递到另一个页面,但不同的是,转发是将同一个请求传给下一个页面, 重定向是创建一个新的请求给下一个页面(可能会报空指针异常)之前的页面请求会结束生命周期。
转发:同一请求在服务器之间传递,地址栏不变,也叫服务器跳转。
重定向:由客户端发送一次新的请求来访问跳转后的目标资源,地址栏改变,也叫客户端跳转。
如果两个页面之间需要通过request来传值,则必须使用转发,不能使用重定向。
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><h1>Forward</h1><%request.setAttribute("name","tom");request.getRequestDispatcher("target.jsp").forward(request,response);response.sendRedirect("target.jsp");%></body></html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><h1>Target</h1><%String name = (String)request.getAttribute("name");out.write(name);%><%=name%></body></html>
一个登录案例
用户登录,如果用户名和密码都正确,则跳转到首页(转发),并且展示用户名,否则重新回到登录页面(重定向)。注:地址栏:localhost:8080//username=admin&password=123123
//login.jsp文件<%--Created by IntelliJ IDEA.User: SimonDate: 2021/11/4Time: 15:40To 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="/check.jsp" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录"></form></body></html>
//check.jsp文件<%--Created by IntelliJ IDEA.User: SimonDate: 2021/11/4Time: 15:42To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%String username = request.getParameter("username");String password = request.getParameter("password");if ("admin".equals(username)&&"123123".equals(password)){request.setAttribute("name",username);request.getRequestDispatcher("welcome.jsp").forward(request,response);//欢迎回来!admin// response.sendRedirect("welcome.jsp"); //欢迎回来!null}else {response.sendRedirect("login.jsp");}%></body></html>
//welcom.jsp文件<%--Created by IntelliJ IDEA.User: SimonDate: 2021/11/4Time: 15:47To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%String name = (String) request.getAttribute("name")%>欢迎回来!</body></html>


