httpservletrequest_HttpServletRequest详解 外加请求转发和重定向口述讲解(五)

点击上方“ IT咸鱼 ”,星标公众号 591bccf00c97a2e90d39f5028b07a1ca.gif每天分享技术栈,开发工具等

续前篇....

咳,今天家里停电电继续更新,每天坚持,前面我们说到response对象的用法和案列,接下来再说说Servlet Request对象用法和案例。

1.ServletRequest,代表的是客户端向服务器发送的请求信息,服务器需要客户端的信息,需要找到ServletRequset对象,才能获得客户端发送的信息。它的子类HttpServletRequset向浏览器向客户端发送信息时,HttpServletRequset对象可以获得请求部分里面的内容。HttpServletRequset是由容器创建的。

2.ServletRequest常用的一些方法:

a)public String getParameter(String name):以 String 形式返回请求参数的值,如果该参数不存在,则返回 null。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。

b)public java.util.Enumeration getParameterNames():返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。

c)public String[] getParameterValues(String name):返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。如果该参数只有一个值,则数组的长度为 1。

d)public java.util.Map getParameterMap() :将请求参数名称作为键、参数值作为映射值的不可变 java.util.Map。参数映射中的键的类型为 String。参数映射中的值的类型为 String 数组。

e)public RequestDispatcher getRequestDispatcher(String path):返回一个 RequestDispatcher 对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发给资源,或者在响应中包含资源。资源可以是动态的,也可以是静态的。

3.HttpServletRequest常用的一些方法。

a)public String getMethod():返回一个浏览器向服务器请求的方式。例如 GET、POST 或 PUT。

4.简单的常用的获取请求参数,将请求参数封装到一个People的bean对象里。

a)第一种方式:当HTML中,表单的input标签属性name的只有唯一的属性值,可以使用getParameter(String name)。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean对象
        People p=new People();
        //获得表单的name对应的value属性值
        String name=req.getParameter("name");
        //获得表单的password对应的value属性值
        String pass=req.getParameter("password");
        //往bean中设置值
        p.setName(name);
        p.setPassword(pass);
        out.print(p.toString());

b)当HTML中,表单的input标签属性name的有相同的属性值,比如密码输入框还有一个重复密码输入框,都是name=password,那么想同时获得这两个password就需要使用到getParameterValues(String name)方法。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean;
        People p=new People();
        String name=req.getParameter("name");
        //获得多个password名称的值
        String[] password=req.getParameterValues("password");
        p.setName(name);
        //设置密码
        p.setPassword(password[0]);
        //设置重复密码
        p.setRepassword(password[1]);
        out.print(p.toString());

c)第三种方式:对于第二种方式我们也可以使用public java.util.Map getParameterMap()方法来做。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean;
        People p=new People();
        //获得请求参数的map映射。
        Map<String,String[]> map=req.getParameterMap();
        for(Map.Entry<String, String[]> entry:map.entrySet()){
            String key=entry.getKey();
            //判断表单中name的属性名称
            if("name".equals(key)){
                String[] name=entry.getValue();
                p.setName(name[0]);
            }else if("password".equals(key)){
                String[] value=entry.getValue();
                //设置密码
                p.setPassword(value[0]);
                //设置重复密码
                p.setRepassword(value[1]);
            }
        }

        out.print(p.toString());

5.复杂的获取请求参数。

在开发中,我们不确定一个bean有多少个属性值,这时我们可以通过内省的方式给bean进行封装。比如对以上三种简单的请求参数获取,我们可以采用内省的方式来做。(注意:采用内省的方式要保证表单中的name名称和bean中的属性名称要保持一样。当表单中的name名称相同的时候,建议采用数组。这里我将重复密码的name属性值名称改为repassword)我们获得他们的所有参数名称(bean中是属性),然后再对属性赋值。这里采用以下两种方式:

a)第一种方式:通过getParameterNames()方法来获得所有的参数名称。采用内省的属性描述器(PropertyDescript)的方式。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean;
        People p=new People();
        Enumeration enums=req.getParameterNames();//遍历枚举集合while(enums.hasMoreElements()){//表单name属性的值
            String propertyName=enums.nextElement();//表单的value属性的值。
            String value=req.getParameter(propertyName);//采用属性描述器try {
                PropertyDescriptor pd=new PropertyDescriptor(propertyName, p.getClass());//获得bean中的属性方法。
                Method method=pd.getWriteMethod();//调用设置指定属性的方法
                method.invoke(p, value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }out.print(p.toString());

b)第二种方式:更简单更适合开发的使用方式。采用第三方的内省jar包BeanUtils工具jar包,是Apache提供的开源工具。里面有一个populer()方法。示例代码如下:

    PrintWriter out = resp.getWriter();
        // 创建一个bean;
        People p = new People();
        Map<String, String[]> map = req.getParameterMap();
        try {
            // 里面可以直接就可以对bean中的属性进行赋值
            BeanUtils.populate(p, map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        out.print(p.toString());

6.案例:获取表单的提交信息。

需求:一个注册的页面提交的数据,封装到bean对象里。示例代码如下:

Person的bean对象。

public class Person {

    private String username;// 用户名
    private String password;// 用户密码
    private boolean married;// 是否婚否
    private String hobby;// 爱好
    private String sex;// 性别
    private String location;// 故乡
        private String descript;
       //省写get和set方法
       public T getXXX(){}
       public void setXXX();{}
       public void toString(){};

将数据封装到bean对象中。

public class RegisterServlet extends HttpServlet {
    //读取请求参数并封装到bean对象中。
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
        PrintWriter out=resp.getWriter();
        Person p=new Person();
        Map map=req.getParameterMap();try {
            BeanUtils.populate(p, map);
        } catch (Exception e) {
            e.printStackTrace();
        }       
        out.print(p);
    }@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req, resp);
    }
}

注册页面

          请输入用户名:<input type="text" name="username"/><br>
          请输入密码:<input type="password" name="password"/><br>
          选择婚否:<input type="checkbox" name="married"/><br>
          选择性别:
              男<input type="radio" name="sex" value="male"/>
              女<input type="radio" name="sex" value="famale"/><br>
          选择爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
                  <input type="checkbox" name="hobby" value="tabletennis">乒乓球
                  <input type="checkbox" name="hobby" value="football">足球<br>
          选择家乡:<select name=location>
              <option value="sh">上海option>
              <option value="bj">北京option>
              <option value="anhui">安徽option>
          select><br>
          简介:<textarea name="descript">textarea><br>
          <input type="image" src="sub.jpg"/>
      form>

注意:表单中的input标签的类型是radio,checkbox,这些类型的表单有对应的名称输入域,如果一个不选择,则服务器接受到数据的是null。如果选择了其中的一个或多个,则把它们的value的取值提交给服务器。如果选择了一个或多个,但value没有取值,则默认提交给服务器的是on。

7.ServletRequest是一个域对象,内部维护了一个Map。

它的域对象常用的方法有:

a)public Object getAttribute(String name):以 Object 形式返回指定属性的值,如果不存在给定名称的属性,则返回 null。

b)public void setAttribute(String name, Object o):存储此请求中的属性

c)public void removeAttribute(String name):从此请求中移除属性。

微信公众号:IT咸鱼关注可了解更多的教程及技术小知识。问题或建议,请公众号留言

请求转发和重定向

1.HTTPServletResponse对象的sendRedirect(String location)方法称作重定向。如果location地址前面加上“/“,则表示相对于Servlet容器的根来请求,即http://localhost:8080,如果lcoation地址前没有加上”/“,则表示相对于当前请求的URL来寻找地址

2.RequestDispatcher的forward(request,response)方法称作为请求转发。如何得到RequestDispatcher对象.

a)方式一:ServletContext.getRequestDispatcher(目标资源的URI); 

目标资源的URI必须以"/"开头,否则报错,此"/"就表示的是当前应用(绝对路径表示法)

b)方式二:ServletRequest.getRequestDispatcher(目标资源的URI);

目标资源的URI如果以"/"开头,就表示的是当前应用(绝对路径表示法)。如果不以"/"开头,就表示相对路径。

3.请求转发使用细节:由源组件转发到目标组件时,容器会清空源组件输出的数据。因此,用户只会看到目标组件输出的页面结果。但是,响应头信息是不清空的。

编码原则:不要在转发前后向页面输出数据,也不要关闭输出流。(做无用功)。

4.包含(RequestDispatcher的include()方法):(动态包含)

使用细节:由源组件包含到目标组件时,容器会清空目标组件的头。因此,源组件设置的头才有效。但是,响应体信息是不清空的。

编码原则:不要在目标组件中设置响应头。(做无用功)

5.请求转发与重定向的区别:

a)请求转发:整个过程处于同一个请求当中

b)重定向:实际上客户端会向服务器端发送两个请求。

c)RequestDispatcher是通过调用HTTPServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。

d)sendRedirect()是HTTPServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

419f9527625335f80f0c4232be25ba5b.gif

Servlet详解(一)之基本概念

2020-10-22

2e93f69f8034af8dd9e7c8c3956e6998.png

专攻知识小点——回顾JavaWeb中的servlet(二)

2020-10-24

d14b3caf7e4b9a82050713fc0457e8fe.png

专攻知识小点——回顾JavaWeb中的servlet(三)

2020-10-25

49e925df760e9842874cdd8ddce23762.png

温故知新之javaweb中的servlet(四)

2020-10-27

9d08496794135d20fbb629665ea04cbf.png

2020-IT咸鱼挑灯夜战整理的java学习资料奉上(推荐收藏)

2020-10-26

926b8b6d330f7cacd39276a0f8a5e275.png

END

如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。

4db1c07757d4f8b751e732b2eb10ee62.png

我知道你 “在看c95fa9147b4dc210c9ef757579b36732.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值