how2j.cn

-->
下载区
文件名 文件大小
j2ee.rar 7k

解压rar如果失败,请用5.21版本或者更高版本的winrar

点击下载 winrar5.21

工具版本兼容问题
request对象的类是HttpServletRequest,提供了很多有实用价值的方法


示例 1 : 先运行,看到效果,再学习   
示例 2 : 模仿和排错   
示例 3 : request的常见方法   
示例 4 : 获取参数   
示例 5 : 获取头信息   
示例 6 : 服务端传参   

示例 1 :

先运行,看到效果,再学习

edit
老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
示例 3 :

request的常见方法

edit
request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST
request的常见方法
import java.io.IOException; import java.io.PrintWriter; 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 service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String password = request.getParameter("password"); System.out.println("浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有): " + request.getRequestURL()); System.out.println("浏览器发出请求的资源名部分,去掉了协议和主机名: " + request.getRequestURI()); System.out.println("请求行中的参数部分: " + request.getQueryString()); System.out.println("浏览器所处于的客户机的IP地址: " + request.getRemoteAddr()); System.out.println("浏览器所处于的客户机的主机名: " + request.getRemoteHost()); System.out.println("浏览器所处于的客户机使用的网络端口: " + request.getRemotePort()); System.out.println("服务器的IP地址: " + request.getLocalAddr()); System.out.println("服务器的主机名: " + request.getLocalName()); System.out.println("得到客户机请求方式: " + request.getMethod()); String html = null; if ("admin".equals(name) && "123".equals(password)) html = "<div style='color:green'>登录成功</div>"; else html = "<div style='color:red'>登录失败</div>"; response.setContentType("text/html; charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.println(html); } }
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。

本例准备了一个注册的例子
包括一个注册页面 register.html
服务端的 RegisterServlet

分别演示了获取单值参数,多值参数以及遍历所有的参数
获取参数
<!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <form action="register" method="get"> 账号 : <input type="text" name="name"> <br> 爱好 : LOL<input type="checkbox" name="hobits" value="lol"> DOTA<input type="checkbox" name="hobits" value="dota"> <br> <input type="submit" value="注册"> </form>
import java.io.IOException; import java.util.Arrays; import java.util.Map; import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RegisterServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("获取单值参数name:" + request.getParameter("name")); String[] hobits = request.getParameterValues("hobits"); System.out.println("获取具有多值的参数hobits: " + Arrays.asList(hobits)); System.out.println("通过 getParameterMap 遍历所有的参数: "); Map<String, String[]> parameters = request.getParameterMap(); Set<String> paramNames = parameters.keySet(); for (String param : paramNames) { String[] value = parameters.get(param); System.out.println(param + ":" + Arrays.asList(value)); } } }
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>RegisterServlet</servlet-name> <servlet-class>RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RegisterServlet</servlet-name> <url-pattern>/register</url-pattern> </servlet-mapping> </web-app>
request.getHeader() 获取浏览器传递过来的头信息。
比如getHeader("user-agent") 可以获取浏览器的基本资料,这样就能判断是firefox、IE、chrome、或者是safari浏览器
request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息

在本例,修改HelloServlet,使其获取头信息
访问HelloServlet获取如下头信息:
host: 主机地址
user-agent: 浏览器基本资料
accept: 表示浏览器接受的数据类型
accept-language: 表示浏览器接受的语言
accept-encoding: 表示浏览器接受的压缩方式,是压缩方式,并非编码
connection: 是否保持连接
cache-control: 缓存时限
获取头信息
import java.io.IOException; import java.util.Date; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet{ public void init(ServletConfig config){ System.out.println("init of Hello Servlet"); } public void doGet(HttpServletRequest request, HttpServletResponse response){ Enumeration<String> headerNames= request.getHeaderNames(); while(headerNames.hasMoreElements()){ String header = headerNames.nextElement(); String value = request.getHeader(header); System.out.printf("%s\t%s%n",header,value); } try { response.getWriter().println("<h1>Hello Servlet!</h1>"); response.getWriter().println(new Date().toLocaleString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享

MVC章节会提供更好实例帮助大家理解这两个方法的用途


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2022-05-21 HttpServletRequest是接口,哪里提供的方法的实现体
Guohandsome

HttpServletRequest是接口,哪里提供的方法的实现体







回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2021-09-29 request.getQueryString()获取请求参数时,已经设置了req.setCharacterEncoding("UTF-8"),为什么输入中文还是显示乱码
logiczqr




req.setCharacterEncoding("UTF-8")不生效
加载中
@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		arg0.setCharacterEncoding("UTF-8");
		String username = arg0.getParameter("username");
		String password = arg0.getParameter("pwd");
		//浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
		StringBuffer requestURL = arg0.getRequestURL();
		//浏览器发出请求的资源名部分,去掉了协议和主机名"
		String requestURI = arg0.getRequestURI();
		// 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
		String queryString = arg0.getQueryString();
		//浏览器所处于的客户机的IP地址
		String remoteAddr = arg0.getRemoteAddr();
		//浏览器所处于的客户机的主机名
		String remoteHost = arg0.getRemoteHost();
		//浏览器所处于的客户机使用的网络端口
		int remotePort = arg0.getRemotePort();
		//服务器的IP地址
		String localAddr = arg0.getLocalAddr();
		//服务器的主机名
		String localName = arg0.getLocalName();
		//得到客户机请求方式一般是GET或者POST
		String method = arg0.getMethod();
		System.out.println("浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有): "+requestURL);
		System.out.println("浏览器发出请求的资源名部分,去掉了协议和主机名: "+requestURI);
		System.out.println("请求行中的参数部分: "+queryString);
		System.out.println("浏览器所处于的客户机的IP地址: "+remoteAddr);
		System.out.println("浏览器所处于的客户机的主机名: "+remoteHost);
		System.out.println("浏览器所处于的客户机使用的网络端口: "+remotePort);
		System.out.println("服务器的IP地址: "+localAddr);
		System.out.println("服务器的主机名: "+localName);
		System.out.println("得到客户机请求方式: "+method);

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-12-03 关于参数为Null
2020-07-23 爱好的复数是hobbies
2020-04-29 中文乱码有人解决了么,改了xml和servlet代码都不行


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 21 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-Servlet-request常见方法 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图