欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

12、HttpServletRequest接口

程序员文章站 2024-02-04 15:30:58
...

1、HttpServletRequest是一个接口,Servlet规范中重要接口之一

2、继承关系:

public interface HttpServletRequest extends ServletRequest{ }

3、HttpServletRequest接口的实现类是WEB容器负责实现的, Tomcat服务器有自己的实现。但是程序员还是只需要面向HttpServletRequest接口调用方法即可,不需要关心具体的实现了。

4、HttpServletRequest这个对象中封装了哪些信息呢?

封装了HTTP请求协议的全部内容:

  • 请求方式
  • URI
  • 协议版本号
  • 表单提交的数据

5、HttpServletRequest一般变量的名字叫做: request,表示请求

  • HttpServletRequest对象代表一次请求,一次请求对应一个request对象,100个请求对应100个request对象,所以request对象的生命周期是短暂的,

什么是一次请求?

到目前为止,我们可以这样理解一次请求:在网页上点击超链接,到最终网页停下来,这就是一次完整的请求。

6、HttpServletRequest接口中常用的方法:

第一组

表单提交的数据,会自动被封装到request对象中,request对象中有Map集合存储这些数据: Map集合的key是name; value是一个字符串类型的一维数组

  1. String getParameter(String name)//通过表单key获取value这个一维数组中的首元素
    (通常情况下这个一维数组中只有一个元素,所以这个方法使用最多)

  2. String[] getParameterValues(String name) //通过Map集合key获取value

  3. Map getParameterMap() //获取整个Map集合

  4. Enumeration getParameterNames() //获取整个Map集合的所有key

范例:
index.html

<form action="/prj-servlet-ServletRequeset/usersubmit" method="post">
    用户名
        <input type= "text" name= "username">
        <br>
    密码
        <input type= "password" name= "password">
        <br>
    性别
        男<input type= "radio" name="sex" value="m">
        女<input type= "radio" name= "sex" value="f">
        <br>
    爱好
        <input type= "checkbox" name= "interest" value= "sport">运动
        <input type= "checkbox" name= "interest" value= "music">音乐
        <input type= "checkbox" name= "interest" value= "dance">跳舞
        <input type= "checkbox" name= "interest" value= "study">学习
        <input type= "checkbox" name= "interest" value= "read">阅读
        <br>
    学历
        <select name= "grade">
            <option value= "gz">高中</option>
            <option value= "dz">大专</option>
            <option value="db">大本</option>
        </select>
        <br>
    简介
        <textarea rows="10" cols= "60" name= "introduce"></textarea>
        <br>
    <input type= "submit" value= "注册">
    <input tvpe= "reset" value= "重置">
</form>

SaveUserServlet类:

public class SaveUserServlet extends HttpServlet {
    @Override
    protected void doPost (HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        //获取用户信息,表单提交的,这些数据被自动封装到request对象中了
        //从request中获取这些信息
        //表单数据是这样的格式提交的,POST请求,在请求体中提交,数据格式:
        //usecname-admin&pas sword=123&sex=m&interest=sport&interest=music&grade=dz&introduc
        /*
        * Map<String, String[]>
        *   key       value
        * --------------------------
        * username  {"admin"}
        * password  {"123"}
        * sex       {"m"}
        * interest  {"sport", "music" }
        * grade     {"dz"}
        * introduce {"ok"}
        */
        String username = request.getParameter("username");
        String password = request.getParameter("password" );
        String sex = request. getParameter("sex");
        //因为getParameter()只能获取首元素,所以这里不能用该方法
        //String interest = request.getParameter("interest");
        String grade = request.getParameter("grade");
        String introduce = request.getParameter("introduce");
        
        System.out.print1n(username);
        System.out.println(password);
        System.out.println(sex);
        System.out.println(grade);
        System.out.println(introduce);
        
        //获取所有的兴趣爱好
        //getParameterValues()这个方法适合取checkbox中的数据
        String[] interests = request.getParameterValues("interest");
        for(String in : interests) {  //foreach
            System.out.println(in);
        }

        //获取整个参数Map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> names = parameterMap.keySet(); //获取key
        for(String name : names) {
            String[] values = parameterMap.get(name); //key获取value
            System.out.print(name + " = "); //不用带有换行的println,使key,valuey同行展示
            for(String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
        
        //获取参数Map集合所有的key
        Enumeration<String> keys = requet.getParameterNames();
        while(keys.hasMoreElements()){
            String name = keys.nextElement();
            System.out.println(name);
        }

    }
}

第二组

  1. String getContextPath() //获取上下文路径,webapp的根路径
  2. String getMethod() //获取浏览器的请求方式
  3. String getRequestURI() //获取URI
  4. StringBuffer getRequestURL() //获取URL
  5. String getServletPath() //获取Servlet PATH ur1- pattern
  6. String getRemoteAddr() //获取客户端IP地址

范例:
web.xml:

<servlet>
  	<servlet-name>myRequest</servlet-name>
  	<servlet-class>com.gkd.javaee.myRequest</servlet-class>
</servlet>
<servlet-mapping>
  	<servlet-name>myRequest</servlet-name>
  	<url-pattern>/myRequest</url-pattern>
</servlet-mapping>

myRequest类:

public class myRequest extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//获取上下文路径[webapp的根路径]
		String contextPath = request.getContextPath();
		out.print("contextPath = " + contextPath + "<br>");
		
		//获取浏览器的请求方式
		String method = request.getMethod();
		out.print("method = " + method + "<br>");

		//获取请求的URI
		String uri = request.getRequestURI();
		out.print("uri = " + uri + "<br>");

		//获取请求的URL
		String url = request.getRequestURL().toString();
		out.print("url = " + url + "<br>");

		//获取Servlet Path
		String servletPath = request.getServletPath();
		out.print("servlet path = " + servletPath + "<br>");

		//获取客户端IP地址
		String clietIp = request.getRemoteAddr();
		System.out.println("client ip =" + clietIp);

	}
	
}

第三组

  1. void setAttribute(String name, object o) //向request范围中存储数据
  2. Object getAttribute(String name ) //request范围中读取数据
  3. void removeAttribute(String name) //移除request范围中的数据
ServletContext是Servlet上下文对象,该接口中也有这样几个方法:
  • void setAttribute(String name, Object o) //向ServletContext范围中添加数据
  • Object getAttribute(String name ) //从ServletContext范围中读取数据
  • void removeAttribute(String name ) //移除ServletContext范围中的数据
ServletContext是一个怎样的范围?

所有用户共享的一个范围对象,我们一般把ServletContext变量命名为: application
可见这个对象代表一个应用。一个webapp只有一个这样的对象。范围极大!

HttpServletRequest是一个怎样的范围呢?

HttpServletRequest类型的变里通常命名为: request,代表当前的本次请求
一次请求对应一个request对象,100个请求对应100个请求对象。
请求范围是极小的,request只能完成在同一次请求中传递数据。

注意:以下两个方法的区别
  • String value = request.getParameter(name); //从表单上获取数据
  • 0bject obi = request.getAttribute(name); //从request范围中获取数据(之前一 定调用过:setAttribute )

范例:一次请求对应一个request对象,这里点击一次算一个请求
index.html :

<a href="/prj-servlet-HttpServletRequest/a"> AServlet </a>
<a href="/prj-servlet-HttpServletRequest/b"> BServlet </a>

AServlet:

public class AServlet extends HttpServlet {
    @Override
    protected void doGet (HttpServletRequest request, HttpServletResponse response )
    throws ServletException, IOException {
    
        //创建User对象
        User user = new User();
        user.setUsercode("111");
        user.setUsername("zhangsan");
        
        //将User对象存储到request范围中
        request.setAttribute("user0bj", user);
        
        //从request范围中取出数据
        0bject obi = request.getAttribute("user0bj");
        resbonse.getWriter().print(obi);
        
    }
}

BServlet:

public class BServlet extends HttpServlet {
    @Override
    protected void doGet (HttpServletRequest request, HttpServletResponse response )
    throws ServletException, IOException {
    
        //从request范围中取出数据
        object obj = request.getAttribute("user0bj");
        respons.getWriter().print(obj);
    
    }
}

BServlet并不能从request中取出实体类user数据,因为点击BServlet的时候,其实是发送了一个新的请求,而BServlet并没有向这个请求里存入user数据,所以取出为null

这是个request的范围问题,如果把两个servlet放到同一个请求中,是不是就解决了?

执行完AServlet之后,跳转到BServlet执行,将AServlet执行和BServlet执行放到同一个请求当中

必须使用转发技术,forward [转发]

  1. 获取请求转发器对象
  2. 调用请求转发器的forward方法即可完成转发

第四组

  1. RequestDispatcher getRequestDispatcher(String path) //获取请求转发器,让转发器对象指向某个资源
public class AServlet extends HttpServlet {
    @Override
    protected void doGet (HttpServletRequest request, HttpServletResponse response )
    throws ServletException, IOException {
    
        //创建User对象
        User user = new User();
        user.setUsercode("111");
        user.setUsername("zhangsan");
        
        //将User对象存储到request范围中
        request.setAttribute("user0bj", user);
        
        //转发[转发属于同一次的请求]
        request.getRequestDispatcher("/b").forward(request, response);
    }
}

第五组

  1. void setCharacterEncoding(String env) //用于解决乱码问题,后面讲

第六组

  1. Cookie[] getCookies() //后面讲【讲Cooki e的时候讲】
  2. HttpSession getSession() //后面讲 【讲Sess ion的时候讲】

关于范围对象的选择:

  • ServletContext应用范围,可以跨用户传递数据
  • ServletRequest请求范围,只能在同一个请求中传递数据【可以跨Servlet传递数据,但是这多个Servlet必须在同一个请求当中】
  • 优先选择request范围,因为占资源少,用完就回收