文章目录
一、Servlet
1.1、关于系统架构
1、系统架构包括:
- C/S架构
- B/S架构
2、C/S架构:
- Client/Server【客户端/服务器】
- C/S架构的软件有那些?
QQ - C/S架构的特点:需要安装特定的客户端软件
- C/S架构的系统优点和缺点分别是什么?
- 优点:
- 数度快(软件中的数据大部分都是集成到客户端软件当中的,很少量的数据从服务器传递送过来,所以C/S结构的系统速度快)
- 体验好(速度又快,界面又好看)
- 界面炫酷(专门的语言去实现界面的,更加灵活)
- 服务器压力小(因为大量的数据都是集成在客户端软件当中,所以服务器只需要传送很少的数据量,当然服务器压力小)
- 安全(因为大量的数据是集成在客户端软件当中的,并且客户端有很多个,服务器虽然只有一个,就算服务器受损了,问题也不大,因为大量的数据在多个客户端上有缓存,有存储,所以从这个方面来说,C/S结构的系统比较安全 )
- 缺点:
- 升级维护比较差(升级维护比较麻烦,每一个客户端软件都需要升级,有一些软件不是那么容易安装的)
- 优点:
3、B/S架构:
- B/S架构【Browser/Server,浏览器/服务器】
- B/S结构的系统是不是一个特殊的C/S系统?
- 实际上B/S结构的系统还是一个C/S,只不过这个C比较特殊,这个Client是一个固定不变浏览器软件。
- B/S结构的系统优点和缺点是:
- 优点:
- 升级维护方便。成本比较低。(只需要升级服务器端即可。)
- 不需要安装特定的客户端软件,用户操作极其方便。只需要打开浏览器,输入网址即可。
- 缺点:
- 速度慢〈不是因为带宽低的问题,是因为所有的数据都是在服务器上,用户发送的每一个请求都是需要服务器全身心的响应数据。所以B/S结构的系统在网络中传送的数据量比较大。)
- 体验差(界面不是那么酷炫,因为浏览器只支持三个语言HTML、CSS、 JavaScript。在加上速度慢。)
- 不安全(所有的数据都在服务器上,只要服务器发生火灾。地震等不可抗力,最终数据全部丢失。)
- 优点:
4、C/S和B/S结构的系统哪个好,那个不好?
- 这个问题问的没有水平。并不是哪个好,哪个不好。不同结构的系统在不同的业务场景下有不同的适用场景。
- 娱乐性软件建议使用?
C/S结构 - 公司内部使用的一些业务软件建议使用?
B/S结构。- 公司内部使用的系统,需要维护成本低。
- 公司内部使用的系统,不需要很酷炫。
- 公司内部使用的企业级系统主要是能够进行数据的维护即可。
二、B/S结构的系通信原理【没有涉及到Java小程序】
2.1、通信原理
-
WEB系统的访问过程。
- 第一步:打开浏览器
- 第二步:找到地址栏
- 第三步:输入一个合法的网址。
- 第四步:回车
- 第五步:在浏览器上会展示响应的结果。
-
关于域名:
- 网址:https://www.baidu.com/
- 域名:www.baidu.com
- 在浏览器地址栏上输入域名,回车之后,域名解析器会将域名解析出来一个具体的IP地址和端口号等。
在浏览器地址栏上输入域名,回车之后,域名解析器会将域名解析出来一个具体的IP地址和端口号等。
-
Ip地址是啥?
- 计算机在网络当中的一个身份证号。在同一个网络当中,iP地址是唯一的。
- A计算机要想和B计算机通信,首先你需要知道B计算机的IP地址,有了IP地址才能建立连接。
- 端口号是啥?
- 一个端口代表一个软件(一个端口代表一个应用。一个端口仅代表一个服务)。
- 一个计算机当中有很多软件,每一个软件启动之后都有一个端口号。
- 在同一个计算机上,端口号具有唯一性。
- 一个WEB系统的通信原理?通信步骤
- 第一步:用户输入网址(URL)
- 第二步;域名解析器进行域名解析;http://110.242.68.3:80/index.html
- 第三步;浏览器软件在网络中搜索110.242.68.3这一台主机,直到找到这台主机。
- 第四步∶定位110.242.68.3这台主机上的服务器软件,因为是80端口,可以很轻松的定位到80端口对应的服务器软件。
- 第五步:80端口对应的服务器软件得知浏览器想要的资源名是:index.html
- 第六步:服务器软件找到lindex.html文件,并且将index.html文件中的内容直接输出响应到浏览器上。
- 第七步:浏览器接收到来自服务器的代码(HTML CSS 1S)。
- 第八步:浏览闇渲染,,执行HTML CSS JS代码,展示效果。
- 什么是请求、什么是响应
- 请求和响应实际上说的是数据的流向不同。
- 从Browser端发送数据到Server端,我们称为请求。英语单词:request
- 从Server端向浏览器Browser端发送数据,我们称为响应。英语单词:response。
- B–>S(请求request)
- os–>B(响应response)
三、关于WEB服务器软件
3.1、Tomcat服务器
- 关于Tomcat服务器的目录
- bin:这个目录是Tomcat服务器的命令文件存放的目录。比如:启动Tomcat,关闭Tomcat等
- conf:这个目录是Tomcat服务器的配置文件存放目录。(server.xml文件中可以配置端口号,默认Tomcat端口是8080)
- lib:这个目录是Tomcat服务器的核心程序目录,因为Tomcat服务器是Java语言编写的,这里的jar包里面都是class文件。
- logs: Tomcat服务器的日志目录,Tomcat服务器启动等信息都会在这个目录下生成日志文件。
- temp: Tomcat服务器的临时目录。存储临时文件。
- webapps:这个目录当中就是用来存放大量的webapp (web application:web应用)
- work:这个目录是用来存放JSP文件翻译之后的java文件以及编译之后的class文件。
3.2、对于一个动态的web应用来说,一个请求和响应的过程有多少个角色参与,角色和角色之间有多少个协议
-
有那些角色【在整个B/S结构的系统中,有哪些人参加的】
- 浏览器软件的开发商(谷歌浏览器、火狐浏览器)
- WEB开发团队(Tomcat等)
- DB Server的开发团队(MySQL等)
- webapp的开发团队
-
角色之间的协议
四、使用Ideal工具开发Servlet
1、 准备工作
创建工程
2、编写Servlet【StudentServlet】
public class StudentServlet implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//设置响应的内容类型
response.setContentType("text/html;charset=GBK");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//连接数据库
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/xs";
String user = "root";
String password = "xuxiaoqiang1234";
conn = DriverManager.getConnection(url,user,password);
//获取预编译的数据库操作对象
String sql = "select * from user";
ps = conn.prepareStatement(sql);
//执行SQL
rs =ps.executeQuery();
//处理结果集
while (rs.next()){
String name = rs.getString("name");
String age = rs.getString("age");
out.println(name+","+age+","+"<br>");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
//释放资源
if (rs !=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
if (ps !=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3、连接数据库驱动
放在lib目录下
4、创建html界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>student page</title>
</head>
<body>
<!--这里的项目名是 /xmn,无法动态获取,先写死-->
<a href="/xmn/servlet/studnet">studnet list</a>
</body>
</html>
5、在web.xml文件中完成StuentServlet类的注册
<servlet>
<servlet-name>StudentServelt</servlet-name>
<servlet-class>com.xs.javaweb.servlet.StudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentServelt</servlet-name>
<url-pattern>/servlet/studnet</url-pattern>
</servlet-mapping>
6、配置tomcat
五、Servlet对象的生命周期
5.1、什么是Servlet对象的生命周期
- Servlet对象什么时候被创建。
- Servlet对象什么时候被销毁。
- Servlet对象创建了几个?
- Servlet对象的生命周期表示:一个Servlet对象从出生在最后的死亡,整个过程是怎样的。
5.2、Servlet对象是由谁来维护的【Servlet02】
- Servlet对象的创建,对象上方法的调用,对象最终的销毁,Javaweb程序员是无权干预的。
- Servlet对象的生命周期是由Tomcat服务器【WEB Server】全权负责的。
- Tomcat服务器通常我们又称为:WEB容器。
- WEB容器来管理Servlet对象的死活。
5.3、思考:我们自己newSServlet对象受WEB容器的管理吗?
- 我们自己new的Servlet对象是不受WEB客器管理的。
- WEB容器创建的Servlet对象,这些Servlet对象都会被放到一个集合当中(HashMap),只有放到这个HashMap集合中的Servlet才能些被WEB容器管理。自己new的Servlet对象不会被WEB容器管理。
5.4、研究:服务器在启动的Servlet对象有没有被创建出来(默认情况下)
- 在Servlet中提供一个无参数的构造方法,启动服务器的时候看看构造方法是否执行。
- 经过测试得出结论:默认情况下,服务器在启动的时候Servlet对象并不会被实例化。
- 这个设计是合理的。用户没有发送请求之前,如果提前创建出来所有的Servlet对象,必然是耗费内存的,并且创建出来的Servlet如果一直没有用户访问,显然这个Servlet对象是—个废物,没必要先创建。
5.5、怎么让服务器启动的时候创建Servelt对象
1、在servlet标签中添加 <load-on-startup>整数</load-on-startup>
子标签,在该子标签中填写整数,数越小优先级越高
5.6、Servlet对象生命周期
1、默认情况下服务器启动发时候AServlet对象并没有被 实例化
2、用户发送第一次请求时,控制台输出一下内容
3、根据以上输出内容得出结论:
- 用户在发送第一次请求的时候Serlet对象被实例化(AServlet的构造方法被执行了。并且执行的是无参数构造方法。)
- AServlet对象被创建出来之后,Tomcat服务器马上调用了AServlet对象的init方法。(inlt方法在执行的时候,AServlet对象已经存在了。已经被创建出来了。)
- 用户发送第一次请求的时候,init方法执行之后,Tomcat服务器马上调用AServlet对象的service方法。
- 用户继续发送第二次请求的时候,控制台输出一下内容:
4、根据以上输出结果得知,用户在发送第二次,或者第三次,或者第四次请求的时候,Servlet对象并没有新建,还是使用之前创建好的Servlet对象,直接调用该Servlet对象的service方法,这说明:
- 第一:Servlet对象是单例的(单实例的,但是要注意:Servlet对象是单实例的,但是Servlet类并不符合单例模式。我们称之为假单例。之所以单例是因为Servlet对象的创建我们javaweb程序员管不着,这个对象的创建只能是Tomcat来说了算,Tomcat只创建了一个,所以导致了单例,但是属于假单例。真单例模式,构造方法是私有化的。)
- 第二:无参数构造方法、init方法只在第一次用户发送请求的时候执行。也就是说无参数构造方法只执行一次。init方法也只被Tomcat服务器调用—次。
- 第三:只要用户发送一次请求: service方法必然会被Tomcat服务器调用一次。发送100次请求,servlce方法会被调用100次。
5、关闭服务器的时候,控制台输出以下内容:
-
通过以上输出内容,可以得到以下结论
- Servlet的destroy方法只被Tomcat服务器洞用一次。
- destroy方法是在什么时候被调用的?
- 在服务器关闭的时候。
- 因为服务器关闭的时候要销毁AServlet对象的内存。
- 服务器在销毁AServlet对象内存之前,Tomcat服务器会自动调用AServlet对象的destroy方法。
-
请问:destory方法调用的时候,对象摧毁了还是没有被摧毁
destroy方法执行的时候ASevlet对象还在,没有被销毁。destroy方法执行结束之后,ASerlet对象的内存才会被Tomcat释放。|
6、关于servlet类中的方法的调用次数
- 构造方法只执行一次。
- init方法只执行一次。
- service方法:用户发送一次请求则执行一次,发送N次请求则执行N次。
- destroy方法只执行一次。
7、当我们Servlet类中编写一个有参数的构造方法,如果没有手动编写无参数构造方法会报500
8、什么时候使用init方法
- init方法很少用。
- 通常在init方法当中做初始化操作,并且这个初始化操作只需要执行一次。例如:初始化数据库连接池,初始化线程地…
9、什么时候使用destory方法
- destroy方法也很少用。
- 通常在destroy方法当中,进行资源的关闭。马上对象要被销毁了,还有什么没有关闭的,抓紧时间关闭资源。还有什么资源没保存的,抓紧时间保存一下。
六、ServlitConfig【Servlet03-ConfigTestServlet】
- 什么是ServletConfig?
- Servlet对象的配置信息对象。
- ServletConfig对象中封装了在这里插入代码片
<servlet></servlet>
标签中的配置信息。(web.xml文件中servlet的配置信息)
- —个Servlet对应—个ServletConfig对象。
- Servlet对象是Tomcat服务器创建,并且SenvletConfig对象也是Tomcat服务器创建。并且默认情况下,他们都是在用户发送第一次请求的时候创建
- Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。
- ServletConfig接口的实现类是Tomcat服务器给实现的。(Tomcat服务器说的就是WEB服务器。)
6.1、getServletName()【获取<servlet-name></servlet-name>
】
response.setContentType("text/html;charset=GBK");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//获取ServletConfig对象
ServletConfig config = this.getServletConfig();
//输出该对象
//ServletConfig对象是org.apache.catalina.core.StandardWrapperFacade@7d7e90b8
out.print("ServletConfig对象是"+config.toString());
out.print("<br>");
//获取<servlet-name></servlet-name>
//configTest
String servletName = config.getServletName();
out.print("<servlet-name>"+servletName+"</servlet-name>");
out.print("<br>");
6.2、getInitParameterNames()和getInitParameter()方法
通过ServletConfig对象的两个方法,可以获取到web.xml文件中的初始化参数配置信息
1、web.xml信息
<servlet>
<servlet-name>configTest</servlet-name>
<servlet-class>com.xs.javaweb.servlet.ConfigTestServlet</servlet-class>
<!--这里是可以配置一个Servlet对象的初始化信息的-->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/xs</param-value>
</init-param>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>xuxiaoqiang1234</param-value>
</init-param>
</servlet>
2、ConfigTestServlet
Enumeration<String> initParameterNames = config.getInitParameterNames();
//遍历集合
while (initParameterNames.hasMoreElements()){
String parameterName = initParameterNames.nextElement();//取元素
String initParameter = config.getInitParameter(parameterName);//通过name获取value
out.print(parameterName+"="+initParameter);
out.print("<br>");
6.3、ServletConfig接口中有4个方法
- 第1个方法:
public String getInitParameter(String name); - 第2个方法:
public Enumeration getInitParameterNames() - 第3个方法:
public Servletcontext getServletContext() - 第4个方法:
public String getservletName()
以上的4个方法,在自己编写的Servlet类当中也可以使用this去调用。(这个Servlet继承了GenericServlet)
七、ServletContext【Servlet04】
7.1、ServletContext是什么?
ServletContext是接口,是Service规范中的一员
7.2、ServletContext是谁实现的?
Tomcat服务器实现了ServletContext接口
7.3、ServletContext对象是谁创建的?在什么时候创建的?
- ServletContext对象在WEB服务器启动的时候创建。
- ServletContext对象是WEB服务器创建的。
- 对于一个webapp来说,ServletContext对象只有一个。
- ServletContext对象在服务器关闭的时候销毁。
7.4、ServletContext怎么理解?
-
context是什么意思?
Servlet对象的环境对象。(Servlet对象的上下文对象。)
-
ServletContext对象其实对应的就是整个web.xml文件。
-
50个学生,每个学生都是一个Servlet,这50个学生都在同一个教室当中。那么这个教室就相当于ServletContext对象。
-
放在Servletcontext对象当中的数据,所有Servlet一定是共享的
比如:一个教室中的空调是所有学生共享的,一个教室中的语文老师是所有学生共享的。
-
Tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp对应一个ServletContext对象。
-
一个Servlet对象对应一个ServletConfig。100个Servlet对象则对应100个ServletConfig对象。
-
只要在同一个webapp当中,只要在同一个应用当中,所有的Senvlet对象都是共享同一个ServletContext对象的。
-
ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。
7.5、ServletContext接口中有哪些常用的方法?
1、 getInitParameter(String name)【通过初始化参数的name获取value】、getInitParameterNames()【获取所有的初始化参数的name】
//获取ServletConfig对象
ServletContext context = this.getServletContext();
out.print("ServletContext对象是:"+context+"<br>");
//获取上下文的初始化参数
Enumeration<String> initParameterNames = context.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
String value = context.getInitParameter(name);
out.print(name+"="+value+"<br>");
}
<!--以上两个方法是ServletContext对象的方法,这个方法获取的是什么信息?是以下的配器信息-->
<context-param>
<param-name>pageSize</param-name>
<param-value>10</param-value>
</context-param>
<context-param>
<param-name>startIndex</param-name>
<param-value>0</param-value>
</context-param>
<!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配器信息会放到以上的标签当中。-->
<!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用servletconfig对象来获取。-->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</init-param>
2、getContextPath()【获取应用上下文的根】
//获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
//在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
//获取contextpath (获取应用上下文的根)
String contextPath = context.getContextPath();
out.print(contextPath+"<br>");
//string contextPath = application.getcontextPath();
3、getRealPath()【获取文件的绝对路径及真实路径】
//获取文件的绝对路径
//D:\wworkspace\javaweb\out\artifacts\servlet04_war_exploded\index.html
String realPath = context.getRealPath("/index.html");
out.print(realPath+"<br>");
八、Http协议
8.1、什么是HTTP协议
- http协议:是W3C制定的一种超文本传输协议
- 什么是超文本?
1、超文本说的就是:不是普通文本,比如流媒体:声音、视频、图片等。
2、HTTP协议支持:不但可以传送普通字符串,同样支持传递声音、视频、图片等流媒体信息。
8.2、 HTTP的请求协议
-
HTTP的请求协议包括:4部分
-
请求行
- 包括三部分
-
第一部分:请求方式
- get
- post
- delete
- put
- 。。。。。。
-
第二部分: URI
- 什么是URI: 统一资源标识符。代表网络中某个资源的名字,通过URI是不可以定位到该资源的。
- 什么是URL:统一资源定位符。代表网络中某个资源,同时,通过URL是可以定位到该资源的。
- URI和URL什么关系,有什么区别?
- URL包括URI
http://localhost:8080/servlet05/index.html这是URL
/servlet05/index.html这是URI
- URL包括URI
-
第三部分: HTTP协议版本号
-
- 包括三部分
-
请求头
- 请求的主机
- 主机的端口
- 浏览器信息
- 平台信息 cookie等信息
-
空白行
- 空白行是用来区分“请求头"和"请求体”。
-
请求体
- 向服务器发送的具体数据。
8.3、HTTP的响应协议
- HTTP的响应协议包括:4部分
- 状态行
- 响应头
- 空白行
- 响应体
状态行【三部分组成】
-
第一部分:协议版本号(HTTP/1.1)
-
第二部分:状态码(HTTP协议中规定的响应状态号。不同的响应结果对应不同的号码。)
- 200表示请求响应成功,正常结束。
- 404表示访问的资源不存在,通常是因为要么是你路径写错了,要么是路径写对了,但是服务器中对应的资源并没有启动成功。总之404错误是前端错误。
- 405表示前端发送的请求方式与后端请求的处理方式不一致时发生:
- 比如:前端是POST请求,后端的处理方式按照get方式进行处理时,发生405
- 比如:前端是GET请求,后端的处理方式按照post方式进行处理时,发生405
- 500表示服务器端的程序出现了异常。一般会认为是服务器端的错误导致的。
- 以4开始的,一般是浏览器端的错误导致的。
- 以5开始的,一般是服务器端的错误导致的。
-
第三部分:状态的描述信息
- ok表示正常成功结束。
- not found表示资源找不到。
响应头:
- 响应的内容类型
- 响应的内容长度
- 响应的时间
空白行:
- 用来分隔“响应头"和“响应体”的。
响应体:
- 响应体就是响应的正文,这些内容是一个长的字符串,这个字符串被浏览器渲染,解释并执行,最终展示出效果。
8.4、Get和Post请求的区别
-
怎么向服务器发送GET请求,怎么向服务器发送POST请求?
- 到目前为止,只有一种情况可以发送POST请求,使用form表单,并且form标签中的method属性值为: method=“post”。其他所有情况一律都是get请求:
- 在浏览器地址栏上直接输入URL,敲回车,属于get请求。
- 在浏览器上直接点击超链接,属于get请求。
- 使用form表单提交数据时,form标签中没有写method属性,默认就是get
- 或者使用form的时候,form标签中method属性值为: method=“get”…
-
GET请求和POST请求有什么区别?
-
get请求发送数据的时候,数据会挂在URI的后面,并且在URI后面添加一个"?“,”?"后面是数据。这样会导致发送的数据回显在浏览器的地址栏上。(get请求在“请求行"上发送数据)
-
post请求发送数据的时候,在请求体当中发送。不会回显到浏览器的地址栏上。也就是说post发送的数据,在浏览器地址栏上看不到。
(post在“请求体"当中发送数据) -
get请求只能发送普通的字符串。并且发送的字符串长度有限制,不同的浏览器限制不同。这个没有明确的规范。
-
get请求无法发送大数据量。
-
post请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频、声音、图片。
-
post请求可以发送大数据量,理论上没有长度限制。
-
get请求在W3C中是这样说的:get请求比较适合从服务器端获取数据。
-
post请求在W3C中是这样说的:post请求比较适合向服务器端传送数据。
-
get请求支持缓存
-
post请求不支持缓存
-
九、HttpServlet
9.1、HttpServletRequest接口中的常用方法【Request】
怎么获取前端浏览器用户提交的数据
Map<String ,String[ ]> getParameterMap( ) :这个是获取map
注意:前端传过来的数字是以字符串的形式提交的,所有后端接收到的是字符串
Enumeration<String> getParameterNames():这个是获取Map集合中所有的key
String[] getParameterValues(String name):根据key获取Map集合的value
String getParameter(String name):获取value这个一维数组当中的第一个元素
获取前端传过来的值
//getParameter 获取的是第一个
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
//获取map集合
String[] interests2 = request.getParameterValues("interest");
for (String interest : interests2){
System.out.println("interest = " + interest);
}
9.2、request域
- 请求域对象的方法
void setAttribute(String name,Object obj)//向域当中绑定数据
Object getAttribute(String name)//从域中根据name获取
void removeAttribute(String name);//将域中绑定的数据移除
1、向Aservlet存储的东西在Bservlrt中取不到,如果要想得到Aservlet里的 东西,则需要请求转发
2、跳转
- 转发(一次请求)
//第一步:获取请求转发对象
//相当于把”/b“这个路径包装到请求转发器当中,实际上是把下一个跳转的资源的路径告知给Bservlrt服务器
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/b");
//第二步:调用请求转发RequestDispatcher的
requestDispatcher.forward(request,response);
//两步并一步
request.getRequestDispatcher("/b").forward(request, response);
3、getParameter
和getAttribute
的区别
9.3、HttpServletQuest接口的其他常用方法
乱码问题
//get请求在请求行上提交数据
//post请求在请求体中提交数据
//设置请求体的字符集(显然这个方法是处理post请求的乱码问题,这种方式不能解决get请求的乱码)
request.setcharEncoding("UTF-8");
//在tomcat9之前,如果前端请求体提交的是中文,后端出现乱码
response,setContentType("text/html;charset=UTF-8");
//get请求乱码问题
//修改CATALINA_HOME/conf/server.xml配置文件
<Connector URIEcoding="UTF-8">
获取客户端的IP地址
String remoteAddr = request.getRemoteAddr();
获取应用的根路径
String contextPath = request.getContextPath();
获取请求方式
String method = request.getMethod()
获取请求uri
String uri = request.getRequestURI();
9.4、在一个web应用中应该如何完成资源的跳转
- 在一个web应用中通过两种方式,可以完成资源的跳转
- 第一种方式:转发
- 第二种方式:重定向
- 转发和重定向的区别
代码的区别
- 转发【转发都是一次请求】
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/b");
//第二步:调用请求转发RequestDispatcher的
requestDispatcher.forward(request,response);
//两步并一步
request.getRequestDispatcher("/b").forward(request, response);
- 重定向【两次请求】
//浏览器发送请求,请求路径上是需要添加项目名的
response.sendRedirect("/项目名/b")
两者本质区别
- 转发:是由WEB服务器来控制的,A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的
- 重定向:是浏览器完成的,具体跳转到那个资源,是浏览器说了算
转发和重定向应该如何选择?什么时候使用转发,什么时候使用重定向?
- 如果在上一个Servlet当中向request域当中绑定了数据,希望从下一个Servlet当中把rgquest域里面的数据取出来,使用转发机
制。 - 剩下所有的请求均使用重定向。【重定向使用较多】