0
点赞
收藏
分享

微信扫一扫

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

扬帆远航_df7c 2022-03-31 阅读 43

咳,今天家里停电电继续更新,每天坚持,前面我们说到​​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<E> getParameterNames():返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。

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

d)public java.util.Map<K, V> 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<K, V> 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<String> 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<String, String[]> map=req.getParameterMap();
try {
BeanUtils.populate(p, map);
} catch (Exception e) {
e.printStackTrace();
}

out.print(p);
}

@Override
protected 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"/>&nbsp;&nbsp;&nbsp;
<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<String,Object>。

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

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对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

​Servlet详解(一)之基本概念2020-10-22HttpServletRequest详解 外加请求转发和重定向口述讲解(五)_java


​​专攻知识小点——回顾JavaWeb中的servlet(二)2020-10-24HttpServletRequest详解 外加请求转发和重定向口述讲解(五)_java_02 ​​


​​专攻知识小点——回顾JavaWeb中的servlet(三)2020-10-25HttpServletRequest详解 外加请求转发和重定向口述讲解(五)_表单_03 ​​


​​温故知新之javaweb中的servlet(四)2020-10-27HttpServletRequest详解 外加请求转发和重定向口述讲解(五)_java_04 ​​


​​2020-IT咸鱼挑灯夜战整理的java学习资料奉上(推荐收藏)2020-10-26HttpServletRequest详解 外加请求转发和重定向口述讲解(五)_请求参数_05 ​​

END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 公众号可以第一时间接受到博文推送。
举报

相关推荐

0 条评论