1、request对象的介绍
用于获取客户端请求信息,如请求参数、请求头、URL、客户端 IP 地址等。它代表当前的 HTTP 请求。
一个请求对象request对应一个请求域对象。一次请求结束之后,这个请求域就销毁了。
1.1 request对象是HttpServletRequest接口的实例
- HttpServletRequest是一个接口,全限定名称:jakarta.servlet.http.HttpServletRequest
- HttpServletRequest对象中都有什么信息?都包装了什么信息?
-
- HttpServletRequest的实现类是Tomcat服务器负责创建的。这个对象中封装了什么信息?封装了HTTP的请求协议。
- 实际上是用户发送请求的时候,遵循了HTTP协议,发送的是HTTP的请求协议,Tomcat服务器将HTTP协议中的信息以及数据全部解析出来,然后Tomcat服务器把这些信息封装到HttpServletRequest对象当中,传给了我们javaweb程序员。
- javaweb程序员面向HttpServletRequest接口编程,调用方法就可以获取到请求的信息了。
- request和response对象的生命周期?
-
- request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。
- 一次请求对应一个request。
- 两次请求则对应两个request。
- .....
1.2 使用request对象获取表单请求的数据
常用的方法:
Map<String,String[]> getParameterMap() 这个是获取Map
Enumeration<String> getParameterNames() 这个是获取Map集合中所有的key
String[] getParameterValues(String name) 根据key获取Map集合的value
String getParameter(String name) 获取value这个一维数组当中的第一个元素。这个方法最常用。
// 以上的4个方法,和获取用户提交的数据有关系。
方法名称 | 说明 |
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[ ] getParameterValues(String name) | 获取表单组件对应多个值时的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
示例;
客户端表单:
<form action="/Test03/NewsServlet?action=getNewsPage" method="post">
<b>编号:</b><input type="text" name="newId" value="${requestScope.newId}"/>
<b>标题:</b><input type="text" name="newName" value="${requestScope.newName}"/><%-- 按照name - value 键值对存储 --%>
</form>
服务器:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
............省略部分代码
String newId = req.getParameter("newId");//接收表单的数据按照name-value
String newName = req.getParameter("newName");
}
思考:如果是你,前端的form表单提交了数据之后,你准备怎么存储这些数据,你准备采用什么样的数据结构去存储这些数据呢?
- 前端提交的数据格式:username=abc&userpwd=111&aihao=s&aihao=d&aihao=tt
- 我会采用Map集合来存储:
Map<String,String>
key存储String
value存储String
这种想法对吗?不对。
如果采用以上的数据结构存储会发现key重复的时候value覆盖。
key value
---------------------
username abc
userpwd 111
aihao s
aihao d
aihao tt
这样是不行的,因为map的key不能重复。
Map<String, String[]>
key存储String
value存储String[]
key value
-------------------------------
username {"abc"}
userpwd {"111"}
aihao {"s","d","tt"}
- 注意:前端表单提交数据的时候,假设提交了120这样的“数字”,其实是以字符串"120"的方式提交的,所以服务器端获取到的一定是一个字符串的"120",而不是一个数字。(前端永远提交的是字符串,后端获取的也永远是字符串。)
四个方法的使用:
//username=zhangsan&userpwd=123&interest=s&interest=d
/*Map<String,String[]>
key value
---------------------------
"username" {"zhangsan"}
"userpwd" {"123"}
"interest" {"s", "d"} */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException{
/*1.最常用的方式 String getParameter(String name)*/
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
System.out.println(username);
System.out.println(userpwd);
/*2.既然是checkbox,调用方法:request.getParameterValues("interest")*/
String[] interests = request.getParameterValues("interest");
for(String i : interests){
System.out.println(i);
}
/*3.直接通过getParameterNames()这个方法,可以直接获取这个Map集合的所有key*/
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name);
}
/*4.获取参数Map集合*/
Map<String,String[]> parameterMap = request.getParameterMap();
// 遍历Map集合(获取Map集合中所有的key,遍历)
Set<String> keys = parameterMap.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.print(key+"=");
// 通过key获取value
String[] values = parameterMap.get(key);
for(String value : values){
System.out.print(value+",");
}
System.out.println();
/*4.输出结果
username=zhangsan,
userpwd=123,
interest=s,d,
}
1.3 请求作用域
request对象也是请求域对象
一个请求对象request对应一个请求域对象。一次请求结束之后,这个请求域就销毁了这就是它的生命周期。
它还有这三个方法:
// 存(怎么向request请求域中存数据)
public void setAttribute(String name, Object value); // map.put(k, v)
// 取(怎么从request请求域中取数据)
public Object getAttribute(String name); // Object v = map.get(k)
// 删(怎么删除request请求域中的数据)
public void removeAttribute(String name); // map.remove(k)
两个Servlet怎么共享数据?
- 将数据放到ServletContext应用域当中,当然是可以的,但是应用域范围太大,占用资源太多。不建议使用。
- 可以将数据放到request域当中,然后AServlet转发到BServlet,保证AServlet和BServlet在同一次请求当中,这样就可以做到两个Servlet,或者多个Servlet共享同一份数据。
2 、response 对象的介绍
response
对象(即 HttpServletResponse接口实现类的实例对象
这个实例对象有web服务器来创建)是 JSP 和 Servlet 中用来表示服务器对客户端响应的对象。它包含了服务器返回给客户端的所有响应信息,如状态码、响应头、响应内容等。
2.1 HttpServletResponse
对象的常用的功能
设置响应内容类型(MIME Type): 通过设置响应的内容类型,可以告诉客户端如何处理和显示返回的内容,如 HTML 页面、JSON 数据、图片等
response.setContentType("text/html;charset=UTF-8");
text/html
表示返回的是 HTML 页面。charset=UTF-8
设置响应体的字符编码为 UTF-8,以正确处理多字节字符(如中文)。
向客户端输出数据: 通过 response.getWriter()
或 response.getOutputStream()
可以向客户端发送响应数据(HTML、JSON、文件等)。
PrintWriter writer = response.getWriter();
writer.println("<html><body><h1>Hello, World!</h1></body></html>");
writer.println();
writer.flush();
writer.close();
设置 Cookie: 可以通过 response
对象向客户端发送 Cookie。
Cookie cookie = new Cookie("user", "John");
response.addCookie(cookie);
重定向:response.sendRedirect()
方法可以实现客户端重定向,即告诉浏览器请求另一个 URL。
response.sendRedirect("/anotherPage.jsp");
2.2 response
对象的常用方法
setContentType(String type)
:设置响应的内容类型和编码。setStatus(int sc)
:设置 HTTP 响应状态码。getWriter()
:返回PrintWriter
对象,用于输出字符数据。getOutputStream()
:返回ServletOutputStream
对象,用于输出二进制数据(如图片、文件等)。sendRedirect(String location)
:重定向客户端到另一个 URL。addCookie(Cookie cookie)
:向响应中添加一个 Cookie。setHeader(String name, String value)
:设置响应头。
2.3 响应流程简述
- 客户端发送请求到服务器,服务器接收请求并处理。
- 服务器通过
request
对象读取请求数据(如表单参数、Cookie、Header 等)。 - 服务器完成业务逻辑处理后,通过
response
对象生成响应。 - 服务器通过
response
对象向客户端返回响应内容(如 HTML 页面、JSON 数据、文件等)。 - 客户端接收响应并根据响应内容进行处理或显示
response
对象与请求的关系:
response
是服务器生成响应并发送给客户端的对象,而 request
则是服务器接收请求时的对象。两者通常配合使用,服务器通过 request
对象读取客户端请求的信息,并通过 response
对象将处理结果返回给客户端。
3 请求转发和重定向
转发(Forward) 和 重定向(Redirect) 是 Java Web 开发中常用的两种请求处理方式,它们有着不同的特点和使用场景
3.1 请求转发
转发是指服务器端内部的跳转,客户端的浏览器不会感知到 URL 发生了变化。转发操作由服务器完成,目标资源与原请求共享同一个 request
和 response
对象。
1.原理: 是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的
// 第一步:获取请求转发器对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
// 第二步:调用转发器的forward方法完成跳转/转发
dispatcher.forward(request,response);
// 第一步和第二步代码可以联合在一起。
request.getRequestDispatcher("/b").forward(request,response);
//注意:转发的时候是一次请求,会将当前的request和response对象传递给下一个servlet.
- 转发的下一个资源必须是一个Servlet吗?
不一定,只要是Tomcat服务器当中的合法资源,都是可以转发的。例如:html....
注意:转发的时候,路径的写法要注意,转发的路径以“/”开始,不加项目名(也就是说相对于根路径来写的 不过要注意写的时候要以/为开头)。
关于request对象中两个非常容易混淆的方法:
// uri?username=zhangsan&userpwd=123&sex=1
String username = request.getParameter("username");
// 之前一定是执行过:request.setAttribute("name", new Object())
Object obj = request.getAttribute("name");
// 以上两个方法的区别是什么?
// 第一个方法:获取的是用户在浏览器上提交的数据。
// 第二个方法:获取的是请求域当中绑定的数据。
特点:
在请求转发过程中,浏览器只发送一个了个Http请求协议包。
参与本次请求的所有Servlet共享同一个请求协议包,因此
这些Servlet接收的请求方式与浏览器发送的请求方式保持一致
- 服务器端跳转:转发是在服务器内部进行的,客户端浏览器的地址栏不会改变,URL 保持不变。
- 共享请求信息:原始的
request
和response
对象在转发过程中会共享,目标资源可以访问原始请求的所有信息(包括参数、属性等)。
3.2 重定向
重定向是客户端的浏览器发起两次请求,服务器响应一个重定向状态码(通常为 302),并通知客户端浏览器访问新的 URL。客户端会发起第二次请求,去访问服务器提供的新资源。
1.工作原理:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。
2.实现命令
response.sendRedirect("请求地址")
//注意:重定向地址需要加上 项目名
//因为浏览器发送请求是需要加上项目名的
3.特征:
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2)请求次数
浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。
后续请求都是浏览器自动发送的。
3) 请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
4.缺点:
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
消耗在往返次数上,增加用户等待服务时间
特点:
- 客户端跳转:重定向是客户端行为,浏览器地址栏会改变为新的 URL。
- 不共享请求信息:原始的
request
和response
对象在重定向过程中不会共享。第二次请求是一个全新的请求,原始的请求参数和属性无法在新请求中直接访问。 - 适合跨域跳转或返回全新页面:重定向适用于返回新的页面或跳转到其他网站。
- 需要两次请求:重定向需要服务器返回重定向状态码,然后浏览器再次发起新的请求,因此效率比转发低。
3.3 转发和重定向区别
转发 vs 重定向
使用场景总结:
- 转发:适合用于服务器内部的跳转,如表单提交后的处理逻辑、内部模块之间的数据共享、页面内部跳转。
- 重定向:适合用于客户端的跳转,如登录成功后的跳转、跨域跳转、用户注册成功后引导用户访问其他页面。
4 GET和POST有什么区别?
get和post都是属于HTTP的请求协议
HTTP协议:是W3C制定的一种超文本传输协议。(通信协议:发送消息的模板提前被制定好。)
- HTTP协议包括:
-
- 请求协议
-
-
- 浏览器 向 WEB服务器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。
-
-
- 响应协议
-
-
- WEB服务器 向 浏览器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。
-
1. 参数传递方式
- GET:参数通过URL(统一资源定位符)进行传递,放在 URL 的查询字符串中。查询字符串以
?
开始,每个参数之间用&
分隔。例如:
plaintext
复制代码
http://example.com/search?query=java&page=2
- POST:参数通过请求体(Request Body)**进行传递,通常在表单提交时使用,浏览器不会直接显示请求参数。
2. 数据的长度限制
- GET:由于参数是放在 URL 中,不同浏览器和服务器对 URL 的长度有一定的限制。一般来说,URL 的长度限制大约在 2048 字符左右。
- POST:POST 请求没有明确的长度限制,因为参数是通过请求体传输的,可以提交大量数据,适合传输大文件或长文本。
3. 安全性
- GET:由于参数包含在 URL 中,数据容易被直接看到,且会被记录在浏览器历史记录和服务器日志中,所以敏感数据(如密码)不应使用 GET 请求传递。
- POST:参数放在请求体中,相对不易被看到,且不会出现在 URL 中。但需要注意的是,POST 请求并非完全安全,敏感数据仍应通过加密(如 HTTPS)来保护。
4. 作用与场景
- GET:主要用于请求数据,且操作是幂等的,即多次调用相同的 GET 请求,结果应该是相同的。GET 请求一般用于:
- 获取数据(例如获取网页内容、查询数据库)
- 查询操作不会改变服务器的状态
- 搜索查询等
get请求在W3C中是这样说的:get请求比较适合从服务器端获取数据。
- POST:主要用于提交数据,适用于更新资源的操作,比如表单提交、文件上传等。POST 请求可以改变服务器的状态,常用于:
- 提交表单数据
- 文件上传
- 可能对服务器资源产生更新的请求
post请求在W3C中是这样说的:post请求比较适合向服务器端传送数据
5.浏览器缓存与书签
- GET:GET 请求的 URL 会被浏览器缓存,也可以被书签保存,方便用户再次访问。
- POST:POST 请求不会被缓存,也不能被书签保存,因为请求的数据是包含在请求体中而非 URL。
6. 服务器处理
- GET:服务器接收到 GET 请求时,会处理查询参数,并返回相应的资源,通常不会对服务器资源进行修改。
- POST:服务器接收到 POST 请求时,通常会对服务器的资源进行修改,如写入数据库,上传文件等。
7. 可见性
- GET:参数是可见的,包含在 URL 中,容易通过浏览器、网络日志或缓存查看。
- POST:参数不可见,包含在请求体中,不会被直接看到。
典型使用场景
GET:
-
- 搜索引擎查询
- 数据过滤查询
- 加载图片、文件等静态资源
- 查询操作
POST:
-
- 用户登录
- 注册提交
- 上传文件
- 需要修改服务器资源的操作
5 会话对象session(会话域)
一个会话就是浏览器与服务器之间的一次通话,会话可以在多次请求中保存和使用数据
5.1 什么是会话?
用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。会话在服务器端也有一个对应的java对象,这个java对象叫做:session。在jsp(其实jsp也属于服务器)中存在内置对象session。
session对象最主要的作用是:保存会话状态。(用户登录成功了,这是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)
Session
提供了一个简单的机制,让服务器能够跨多个请求共享数据,而不需要每次请求都重新计算或重新发送所有数据。这样可以减少数据库或后端的处理负载,提升应用的性能。
5.2 Session 对象
Session
对象是服务器为每个用户会话创建的一个对象,允许在用户的多个 HTTP 请求之间存储和访问数据。它基于会话的机制,通常用于存储用户状态、身份验证信息等。每个用户在访问应用时,服务器都会为该用户分配一个唯一的 Session ID
,并与 Session
对象绑定。
在 Java Servlet 中,HttpSession
是存储会话信息的类,以下是一些常见方法:
getSession()
: 获取与当前请求关联的会话。如果会话不存在,会创建一个新会话。getAttribute(String name)
: 获取会话中存储的属性值。setAttribute(String name, Object value)
: 在会话中存储属性。invalidate()
: 销毁当前会话。
// 获取Session对象
//这里要注意在服务器端我们需要通过request对象获取回话 但是在jsp页面中 我们可以直接拿内置对象session
HttpSession session = request.getSession();
// 设置Session属性
session.setAttribute("userName", "JohnDoe");
// 获取Session属性
String userName = (String) session.getAttribute("userName");
// 销毁Session
session.invalidate();
Session 生命周期:
- 创建:Session 对象在第一次调用
request.getSession()
方法时创建,或者当用户访问网站时,服务器自动为其创建会话。 - 活跃期:Session 对象在服务器端保持数据,用户可以通过多次请求访问同一 Session 对象中的数据。
- 销毁:Session 对象会在以下几种情况下销毁:
-
- 用户调用
invalidate()
方法手动销毁会话。 - Session 超过设定的超时时间,服务器自动销毁。
- 服务器关闭或重启。
- 用户调用
5.3 Session 作用域
Session
作用域指的是 Session
对象中保存的属性的生命周期和可访问范围。Session
作用域中的数据在同一个用户的多个请求之间共享,而不会对其他用户的会话造成影响。
- 生命周期:数据在 Session 对象的整个生命周期内有效,直到会话被销毁或超时。
- 作用范围:Session 作用域内的属性数据对于当前用户的整个会话都是可见的,无论是通过多个页面或多个请求。
示例:
- 在用户登录时保存用户的用户名:
session.setAttribute("userName", "JohnDoe");
这个用户名会在用户的整个会话中保持有效,直到用户注销或会话超时。
- 当会话结束时,该用户的
Session
作用域中的所有数据都会被销毁。
同样的道理 在session的生命周期内也可以从会话中来获取数据
session.getAttribute("userName");
常用的方法:
// 存(怎么向Session 请求域中存数据)
public void setAttribute(String name, Object value); // map.put(k, v)
// 取(怎么从Session 请求域中取数据)
public Object getAttribute(String name); // Object v = map.get(k)
// 删(怎么删除Session 请求域中的数据)
public void removeAttribute(String name); // map.remove(k)
6 cookie对象
Cookie
对象是用于在客户端和服务器之间存储少量数据的机制,通常用于识别用户或保持会话状态。Cookie
是由服务器创建并发送给浏览器存储的,而每次浏览器发送请求时,都会将相关的 Cookie
一并发送给服务器。
6.1 创建 Cookie
对象
要创建 Cookie
对象,使用 javax.servlet.http.Cookie
类。每个 Cookie
对象都需要一个名称和一个值。创建并配置好 Cookie
后,需要将其添加到 HTTP 响应中,以便浏览器可以接收到这个 Cookie
。
// 创建 Cookie 对象
Cookie userCookie = new Cookie("userName", "JohnDoe");
response.addCookie(cookie);//将cookie 添加到响应中 发送给客户端
6.2 设置 Cookie
的属性
在创建 Cookie
之后,可以设置一些属性来控制其行为:
设置最大存活时间:使用 setMaxAge(int seconds)
方法。
生命周期 (Max-Age
)Cookie
的生命周期是通过 Max-Age
属性控制的。它定义了 Cookie
的存活时间,单位为秒。
- 正数:
Cookie
存在的时间,浏览器会在这个时间内将Cookie
保持在本地。 - 0:表示删除
Cookie
。 - 负数:表示
Cookie
是会话级别的,关闭浏览器后会被删除。
userCookie.setMaxAge(60 * 60 * 24); // 设置 Cookie 存活 1 天
设置路径:使用 setPath(String path)
方法,指定该 Cookie
适用的 URL 路径。
userCookie.setPath("/myApp"); // 该 Cookie 只对 /myApp 路径及其子路径有效
6.3 cookie常见的用法
- 创建 Cookie 在服务器端创建
Cookie
,并将其发送给客户端:
Cookie userCookie = new Cookie("userName", "JohnDoe");
userCookie.setMaxAge(60 * 60 * 24); // 设置Cookie保存1天
response.addCookie(userCookie); // 将Cookie添加到响应中
- 获取 Cookie 当客户端发起请求时,浏览器会自动将所有与该服务器相关的
Cookie
发送给服务器。服务器可以通过HttpServletRequest
对象获取这些Cookie
。
Cookie[] cookies = request.getCookies(); // 获取请求中的所有Cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("userName".equals(cookie.getName())) {
String userName = cookie.getValue(); // 获取名为userName的Cookie的值
}
}
}
- 修改 Cookie 要修改
Cookie
,可以重新创建同名的Cookie
,并将新的值添加到响应中。浏览器会用新的Cookie
覆盖旧的。
Cookie updatedCookie = new Cookie("userName", "JaneDoe");
updatedCookie.setMaxAge(60 * 60 * 24); // 重新设置生命周期
response.addCookie(updatedCookie); // 添加修改后的Cookie
- 删除 Cookie 删除
Cookie
的方法是将其Max-Age
设置为 0,然后添加到响应中:
Cookie cookie = new Cookie("userName", null);
cookie.setMaxAge(0); // 设置Max-Age为0,表示删除该Cookie
response.addCookie(cookie); // 添加到响应中,客户端将删除该Cookie
7 ServletContext(应用域application)
ServletContext
是 Java Web 开发中的一个重要概念,它表示整个 Web 应用程序的上下文,常被称为“应用域”或 application
作用域。ServletContext
对象在应用程序启动时创建,并在应用程序关闭时销毁。它提供了一种在整个应用程序中共享数据的方式,不同的 Servlet 和 JSP 页面都可以通过它来访问和共享数据。
- 一个ServletContext对象通常对应的是一个web.xml文件。
- 只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。
- ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。ServletContext对象是应用级对象。
- ServletContext是一个接口,Tomcat服务器对ServletContext接口进行了实现。
-
- ServletContext对象的创建也是Tomcat服务器来完成的。启动webapp的时候创建的。
7.1ServletContext
的常见操作和方法
1. 获取 ServletContext
对象
可以通过以下几种方式获取 ServletContext
对象:
- 在 Servlet 中:通过
HttpServlet
提供的getServletContext
方法。
ServletContext context = getServletContext();
- 在 JSP 中:可以使用 JSP 的
application
内置对象,它就是ServletContext
对象。
<%= application.getAttribute("someAttribute") %>
2. 设置和获取共享数据
// ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域)
// 如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,
// 可以将这些数据放到ServletContext这个应用域中
// 存(怎么向ServletContext应用域中存数据)
public void setAttribute(String name, Object value); // map.put(k, v)
// 取(怎么从ServletContext应用域中取数据)
public Object getAttribute(String name); // Object v = map.get(k)
// 删(怎么删除ServletContext应用域中的数据)
public void removeAttribute(String name); // map.remove(k)
使用 setAttribute
方法可以在应用范围内存储数据:
// 设置共享数据
ServletContext context = getServletContext();
context.setAttribute("someKey", "someValue");
然后可以在同一应用的其他 Servlet 或 JSP 页面中通过 getAttribute
方法来获取数据:
// 获取共享数据
String value = (String) context.getAttribute("someKey");
3. 获取应用初始化参数
可以通过在 web.xml
文件中定义应用程序的初始化参数:
<!--以上两个方法是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对象来获取。-->
public String getInitParameter(String name); // 通过初始化参数的name获取value
public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
4. 获取应用的上下文路径和资源文件
- 获取应用的上下文路径:
java
复制代码
String contextPath = context.getContextPath();
7.2ServletContext
的生命周期
- 创建:在服务器启动时,当 Web 应用第一次被加载时,容器(如 Tomcat)会创建一个
ServletContext
对象。 - 销毁:当服务器关闭或应用程序被停止时,
ServletContext
对象会被销毁。
7.3 application 与其他作用域的比较
- Request 作用域:仅在当前请求内有效,通常用于存储一次性数据,生命周期短。
- Session 作用域:在用户的整个会话内有效,生命周期长,适用于存储跨多个请求共享的用户数据。
- Application 作用域:在整个 Web 应用程序范围内有效,适用于所有用户和请求,生命周期从服务器启动到服务器关闭。
- request < session < application
8 解决关于get和post请求及重定向的中文乱码的情况
8.1 对于get请求的中文乱码情况
在 Tomcat 8.0.0 之后,GET
请求的默认字符编码方式由 ISO-8859-1
改为了 UTF-8
,这意味着从 Tomcat 8 及更高版本开始,GET
请求不会再出现中文乱码的问题。
若出现乱码的情况 这里给出两个解决办法
- 手动转换编码:
String param = new String(request.getParameter("param").getBytes("ISO-8859-1"), "UTF-8")
- 通过修改Tomcat安装目录中config文件夹下面的server.xml的配置来搞定
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"/>
<!-- URIEncoding="utf-8" 加入代码中 -->
8.2 对于post请求的中文乱码情况
比如提交表单的数据有中文字符
那么服务器就要设置编码来解析发送过来的请求的数据
request.setCharacterEncoding("utf-8");//设置 HTTP 请求的字符编码格式 确保接收到的请求数据按照指定的字符编码
这行代码用于设置 HTTP 请求 的字符编码方式,确保服务器在处理请求参数(尤其是非 ASCII 字符,如中文)时,能够正确解析并避免出现乱码。 值得一说的是这行代码对于get请求无效应为get通过url来传参,post通过请求头传参
8.3 对于重定向的乱码问题
对于重定向乱码举个例子就懂了:
服务器端代码:
@WebServlet("/DemoServlet")
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//设置 HTTP 请求的字符编码格式 确保接收到的请求参数按照指定的字符编码进行解析
resp.sendRedirect("/Demo/demo.jsp?name=小明");
}
}
客户端jsp(这里咱们仅仅是一个测试 所以并不需要输入数据 来到客户端页面直接点击提交进行测试):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form method="post" action="/Demo/DemoServlet">
内容:<input type="text" name="name" ><br>
<input type="submit" value="提交">
</form>
</body>
</html>
重定向页面demo.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>
<%
request.setCharacterEncoding("utf-8");
%>
${param.name}
</h1>
</body>
</html>
重定向页面显示乱码出现??
以上现象重定向的url参数中含有中文字符就会出现乱码,主要原因是 URL 编码 与 字符编码不一致,导致服务器在接收到请求时无法正确解析中文字符。
如何解决?
解决:
在服务器端使用URLEncoder.encode(传输中文字符,"utf-8")先对中午字符编码进行解析 然后对解析数据传输
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//设置 HTTP 请求的字符编码格式 确保接收到的请求参数按照指定的字符编码进行解析
resp.sendRedirect("/Demo/demo.jsp?name="+ URLEncoder.encode("小明","utf-8"));
}