续前篇....
咳,今天家里停电电继续更新,每天坚持,前面我们说到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对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。
Servlet详解(一)之基本概念
2020-10-22
专攻知识小点——回顾JavaWeb中的servlet(二)
2020-10-24
专攻知识小点——回顾JavaWeb中的servlet(三)
2020-10-25
温故知新之javaweb中的servlet(四)
2020-10-27
2020-IT咸鱼挑灯夜战整理的java学习资料奉上(推荐收藏)
2020-10-26
END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。
我知道你 “在看”