Servlet-Request

本文详细介绍了Servlet中HttpServletRequest对象的使用,包括获取请求行、请求头、请求体、请求参数以及资源跳转的方法。通过示例代码展示了如何判断浏览器类型、实现防盗链、读取POST请求体、解析请求参数以及处理中文乱码问题。同时,还探讨了请求转发、数据共享和获取ServletContext对象的功能及其应用场景。

Servlet-Request


<1> 简介

request 和 respons 对象是服务器生成的, 在本机上可以使用
request 对象是来获取请求消息, response 对象是来设置响应消息

<2> 功能

(0) 准备

首先在 servlet 中 src 目录下任意路径下创建 Servlet 对象
在这里插入图片描述
若新建菜单中无此项目, 请参考 Intellij IDEA 2021.1 创建Servlet 详细步骤:
https://blog.youkuaiyun.com/weixin_45518468/article/details/116902257

(1) 获取数据

1.获取请求行
@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 获取请求方式 :GET / POST
		String method = request.getMethod();
		System.out.println(method);
		//2. 获取虚拟目录:
		String contextPath = request.getContextPath();
		System.out.println(contextPath);
		//3. 获取Servlet路径: 
		String servletPath = request.getServletPath();
		System.out.println(servletPath);
		//4. 获取get方式请求参数:(用"&"分隔每一对请求参数(提交的表单))
		String queryString = request.getQueryString();
		System.out.println(queryString);
		//5. 获取请求URI/URL (URL是完整地址,包含http和localhost;URI不包含http和localhost,是URL的一部分)
		String requestURI = request.getRequestURI();
		StringBuffer requestURL = request.getRequestURL();
		System.out.println(requestURI);
		System.out.println(requestURL);
		//6. 获取协议及版本: HTTP/1.1
		String protocol = request.getProtocol();
		System.out.println(protocol);
		//7. 获取客户机的IP地址:
		String remoteAddr = request.getRemoteAddr();
		System.out.println(remoteAddr);
	}
2. 获取请求头
<1> 判断当前使用的浏览器:
String agent=request.getHeader("user-agent");
System.out.println(agent);
if (agent.contains("Chrome")) System.out.println("谷歌");
<2> 防盗链

注: 手动访问页面获取到的 referer 是 null.

String referer=request.getHeader("referer");
System.out.println(referer);
if(referer.contains("www.youku.com")) System.out.println("播放电影");
3. 获取请求体

注: 只有 POST 请求方式才有请求体, 即将请求参数分装成为的整体 (需要将代码写于 doPost 下).

虚拟目录为 /Request05 的类下的内容:

BufferedReader br = request.getReader();
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);

HTML 文档中的内容:

<form action="/Request05" method="post">
	<input type="text" placeholder="请输入用户名" name="username"><br>
	<input type="text" placeholder="请输入密码" name="password"><br>
	<input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female"><input type="radio" name="sex" value="else">非二元性别<br>
	<input type="submit" value="注册">
</form>
注:
form 中 action 的路径要写: 虚拟目录+Servlet资源路径

在网页中输入并提交:
在这里插入图片描述
控制台输出的结果:
在这里插入图片描述

4. 获取请求参数

① 根据参数名称获取参数 (括号内的是参数名称, 即表单中的 name)

String username = request.getParameter("username");

注: 若相同的参数名称对应多个参数, 则返回值为应数组 String[ ]
② 获取所有参数的 map 集合

Map<String, String[]> parameterMap = request.getParameterMap();

③ 获取所有请求的参数名称

 Enumeration<String> parameterNames = request.getParameterNames();

例: 打包获取参数:

Enumeration<String> parameterNames = request.getParameterNames();
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keyset = parameterMap.keySet();
for(String name:keyset){
	String[] values = parameterMap.get(name);
	for (String value:values){
		System.out.println(name+":"+value);
	}
	System.out.println("===========俺是分割线===========");
}
5. 简便写法

当 doGet 和 doPost 内方法相同时, 可用一下方法省略
当 doPost 方法写完之后在 doGet 方法中写入
this.doPost(request,response);

6. 解决中文乱码问题

在 doPost 下首行添加一下代码, 可以解决获取的参数乱码问题:
request.setCharacterEncoding("utf-8");

(2) 资源跳转

1. 请求转发
RequestDispatcher requestDispatcher =request.getRequestDispatcher("/Request08"); //←-此处是跳转页面的虚拟目录
requestDispatcher.forward(request,response);

特点:
① 浏览器地址栏路径不发生变化
② 只能转发到当前服务器的内部资源中
③ 转发是一次请求

2. 数据共享

一次请求访问多个资源

Object msg=request.getAttribute("msg");
System.out.println(msg);

(3) 获取 ServletContext 对象

ServletContext sc=request.getServletContext();
System.out.println(sc);
下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据与静态HTML文档整合,从而实现网页内容的灵活性和可变性。##### JSP的显著特性:1. **动态与静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性和可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简化的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
### 如何通过 `web.xml` 配置文件访问 `loginServlet` 和 `logoutServlet` 在 Java Web 应用程序中,可以通过 `web.xml` 文件来定义和映射 Servlet 的路径。以下是关于如何配置并访问 `loginServlet` 和 `logoutServlet` 的详细说明。 #### 1. 配置 `LoginServlet` 在 `web.xml` 中,`LoginServlet` 被注册并通过 `<servlet>` 和 `<servlet-mapping>` 进行映射。具体配置如下: ```xml <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.hz.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> ``` 上述代码表示当客户端请求 `/login` URL 时,服务器会调用位于 `com.hz.LoginServlet` 类中的逻辑[^1]。 要访问此 Servlet,可以在浏览器地址栏输入以下 URL(假设应用部署在根上下文中): ``` http://<server-address>:<port>/<context-path>/login ``` 如果表单提交到这个 URL,则会触发 `LoginServlet` 的 `doPost` 方法,并从中获取用户名和密码参数[^2]。 --- #### 2. 配置 `LogoutServlet` 同样,在 `web.xml` 中可以找到 `LogoutServlet` 的配置: ```xml <servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>com.hz.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping> ``` 这段 XML 定义了当用户访问 `/logout` 地址时,将由 `com.hz.LogoutServlet` 处理请求[^1]。 为了执行登出操作,通常会在 JSP 页面或其他地方放置一个链接指向 `/logout`,例如: ```jsp <a href="/logout">Logout</a> ``` 点击该链接后,用户的会话可能会被销毁或者清除相关内容,这取决于 `LogoutServlet` 实现的具体逻辑[^4]。 --- #### 3. 访问流程总结 - **登录功能** 用户填写登录表单并将数据 POST 提交至 `/login`,随后进入 `LoginServlet` 的 `doPost` 方法处理业务逻辑[^2]。 - **登出功能** 当用户希望退出系统时,可通过超链接跳转到 `/logout`,从而触发展示的 `LogoutServlet` 来完成清理工作[^4]。 --- ### 示例代码片段 以下是可能的 `LoginServlet` 和 `LogoutServlet` 的简单实现方式: #### LoginServlet.java ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 假设验证成功后的逻辑 if ("admin".equals(username) && "123456".equals(password)) { request.getSession().setAttribute("user", username); response.sendRedirect("/welcome.jsp"); } else { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid credentials."); } } } ``` #### LogoutServlet.java ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LogoutServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().invalidate(); response.sendRedirect("/index.jsp"); } } ``` --- 问题
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烂糊Java汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值