servlet中的HttpServletRequest对象
HttpServletRequest对象表示客户端浏览器发起的请求,当客户端浏览器通过HTTP协议访问服务器时,Tomcat会将HTTP请求中的所有信息解析并封装在HttpServletRequest对象,通过该对象所提供的方法,可以获得客户端请求的所有信息。
通过HttpServletRequest对象获取请求信息
1)getRequestURL()
返回客户端浏览器发出请求时的完整URL。
2)getRequestURI()
返回请求行中的指定资源部分。
3)getRemoteAddr()
返回发出请求的客户机的IP地址。
4)getLocalAddr()
返回Web服务器的IP地址。
5)getLocalPort()
返回Web服务器处理Http协议的连接器所监听的端口。
代码:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//返回客户端浏览器发出请求时的完整URL。
StringBuffer requestURL=request.getRequestURL();
//返回请求行中指定资源部分。
String requestURI=request.getRequestURI();
//返回发出请求的客户机的IP地址。
String remoteAddr=request.getRemoteAddr();
//返回WEB服务器的IP地址。
String localAddr=request.getLocalAddr();
//返回WEB服务器处理Http协议的连接器所监听的端口。
int localPort=request.getLocalPort();
//获取响应对象中的流,返回给客户端
PrintWriter pw=response.getWriter();
//将数据返回给客户端
pw.println(requestURL);
pw.println(requestURI);
pw.println(remoteAddr);
pw.println(localAddr);
pw.println(localPort);
}
运行结果:
通过HttpServletRequest对象获取表单数据
用post提交的表单数据更安全,不会在地址栏显示提交信息
getParameter("key")
根据key值获取指定value,返回一个字符串
1)创建form表单:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="getrequestdata" method="post"> 姓名:<input type="text" name="username" /><br> 密码:<input type="text" name="password" /><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
2)创建servlet
public class GetRequestData extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取用户名 String username=req.getParameter("username"); //获取密码 String password=req.getParameter("password"); //获取响应对象response的流,将结果返回给客户端 PrintWriter pw=resp.getWriter(); //输出username pw.println("username:"+username); //输出password pw.println("password:"+password); }
运行结果:
通过HttpServletRequest对象获取复选框(checkbox)的数据
getParameterValues("checkboxkey")
获取复选框(checkbox组件)中的值,返回一个字符串数组
1)添加checkbox复选框
爱好:<br> <input type="checkbox" name="hobby" value="shufa">书法<br> <input type="checkbox" name="hobby" value="zuqiu">足球<br> <input type="checkbox" name="hobby" value="ganqing">钢琴<br> <input type="checkbox" name="hobby" value="yumaoqiu">羽毛球<br>
2)获取复选框的数据返回给客户端浏览器
//获取复选框数据 String[] hobby=req.getParameterValues("hobby"); List<String> hobbys= Arrays.asList(hobby); //将复选框内容输出到客户端浏览器 pw.println(hobbys);
运行结果:
获取所有提交数据的key
getParameterNames()
获取请求中所有数据的key,返回一个枚举类型。
//获取表单中的所有key,返回枚举类型 Enumeration<String> enumeration=req.getParameterNames(); List<String > paraList=new ArrayList<>(); while (enumeration.hasMoreElements()){ paraList.add(enumeration.nextElement()); } //将form表单中所有key输出到客户端浏览器 pw.println("keys"+paraList);
使用Map结构获取提交数据
getParameterMap()
获取请求中所有的数据并存放到一个Map结构中,返回一个 Map,其中key为String类型,value为String[]类型。
//用Map结构获取提交数据 Map<String,String[]> parameterMap=req.getParameterMap(); Iterator<Map.Entry<String,String[]>> iterator=parameterMap.entrySet().iterator(); //将map中的所有数据输出到客户端浏览器 //从Iterator迭代器中取出每一个Entry,再从Entry取出每一个key-value while (iterator.hasNext()){ Map.Entry<String,String[]> entry=iterator.next(); String key=entry.getKey(); String[] value=entry.getValue(); pw.println("key:"+key); pw.println("value:"+Arrays.asList(value)); }
如何设置请求编码
产生乱码的原因
由于请求的数据包是基于字节在网络上传输的,Tomcat接收到请求数据包后会将数据包中的字节转换为字符。而在Tomcat中使用的是ISO-8859-1的单字节编码来完成字节与字符的转换,因此当数据中含有中文时会出现乱码
如何解决
方法一:
手动重新设置编码
//获取用户名
String username=req.getParameter("username");
String name=new String(username.getBytes("ISO-8859-1"),"UTF-8");
方法二:
通过resquest.setCharacterEncoding("utf-8")对提交的数据根据指定编码方式重新做编码处理,必须在获取请求数据前进行设置
//设置请求编码
req.setCharacterEncoding("utf-8");
资源访问路径
绝对路径
绝对路径访问资源表示直接以”/”作为项目的Context Path。
适用于以”/”作为项目的Context Path。
相对路径
相对路径访问资源表示会相对于项目的Context Path作为相对路径。
获取请求头信息
getHeader("headerKey")
根据请求头中的key,获取对应的value
String headerValue = req.getHeader("headerKey");
getHeaderNames()
获取请求头所有的key,返回枚举类型
Enumeration<String> headerNames = req.getHeaderNames();
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取响应对象的流 PrintWriter pw=resp.getWriter(); //获取请求头的所有key,返回枚举类型 Enumeration<String> enumeration=req.getHeaderNames(); while (enumeration.hasMoreElements()){ //遍历获取key值 String key=enumeration.nextElement(); //通过key值获取value String value=req.getHeader(key); //输出到浏览器 pw.println(key+":"+value); pw.flush(); } pw.close(); }
案例:
编写一个Servlet,如果浏览器的语言是zh-CN,显示“你好, 聪明的中国人!”,如果浏览器的语言设置为en-US,那么则显示 “Hello,American”。
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应编码 resp.setContentType("text/html;charset=utf-8"); //获取响应对象的流 PrintWriter pw=resp.getWriter(); //获取浏览器所支持的语言 String vlaue=req.getHeader("accept-language"); //是否包含"zh-CN"字符串 if (vlaue.contains("zh-CN")){ pw.println("你好,中国人!"); }//是否包含"en-US"字符串 else if(vlaue.contains("en-US")){ pw.println("Hello,American!"); } pw.flush(); pw.println(); }
HttpServletRequest对象的生命周期
1)有请求到达Tomcat时,Tomcat会解析请求
2)创建HttpServletResquest对象,将解析出来的请求封装到HttpServletResques对象中
3)将该对象通过参数的方式传递到Servlet的方法中
4)当请求处理完毕并产生响应后该对象的生命周期结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?