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作为相对路径。

适用于为项目指定的具体的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)当请求处理完毕并产生响应后该对象的生命周期结束

 

posted @   chaplu  阅读(405)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示