JSP(servlet)实现数据传递和保存

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 响应流程简述

  1. 客户端发送请求到服务器,服务器接收请求并处理。
  2. 服务器通过 request 对象读取请求数据(如表单参数、Cookie、Header 等)。
  3. 服务器完成业务逻辑处理后,通过 response 对象生成响应。
  4. 服务器通过 response 对象向客户端返回响应内容(如 HTML 页面、JSON 数据、文件等)。
  5. 客户端接收响应并根据响应内容进行处理或显示

response 对象与请求的关系:

response 是服务器生成响应并发送给客户端的对象,而 request 则是服务器接收请求时的对象。两者通常配合使用,服务器通过 request 对象读取客户端请求的信息,并通过 response 对象将处理结果返回给客户端。

3 请求转发和重定向

转发(Forward)重定向(Redirect) 是 Java Web 开发中常用的两种请求处理方式,它们有着不同的特点和使用场景

3.1 请求转发

转发是指服务器端内部的跳转,客户端的浏览器不会感知到 URL 发生了变化。转发操作由服务器完成,目标资源与原请求共享同一个 requestresponse 对象。

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 保持不变。
  • 共享请求信息:原始的 requestresponse 对象在转发过程中会共享,目标资源可以访问原始请求的所有信息(包括参数、属性等)。

3.2 重定向

重定向是客户端的浏览器发起两次请求,服务器响应一个重定向状态码(通常为 302),并通知客户端浏览器访问新的 URL。客户端会发起第二次请求,去访问服务器提供的新资源。

1.工作原理:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。

2.实现命令

 response.sendRedirect("请求地址")
 //注意:重定向地址需要加上 项目名
 //因为浏览器发送请求是需要加上项目名的

3.特征:

1)请求地址:

既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)

也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)

2)请求次数

浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。

后续请求都是浏览器自动发送的。

3) 请求方式:

重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此

通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】

4.缺点:

重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间

消耗在往返次数上,增加用户等待服务时间

特点:

  • 客户端跳转:重定向是客户端行为,浏览器地址栏会改变为新的 URL。
  • 不共享请求信息:原始的 requestresponse 对象在重定向过程中不会共享。第二次请求是一个全新的请求,原始的请求参数和属性无法在新请求中直接访问。
  • 适合跨域跳转或返回全新页面:重定向适用于返回新的页面或跳转到其他网站。
  • 需要两次请求:重定向需要服务器返回重定向状态码,然后浏览器再次发起新的请求,因此效率比转发低。

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 请求不会再出现中文乱码的问题。

若出现乱码的情况 这里给出两个解决办法

  1. 手动转换编码:
String param = new String(request.getParameter("param").getBytes("ISO-8859-1"), "UTF-8")

  1. 通过修改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"));
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值