12、HttpServletRequest接口

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范围,因为占资源少,用完就回收
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值