HttpServletResquest知识:
Request的主要方法:
request.getRequestURL().toString();//获取URL地址:URL:协议,主机,资源地址
request.getRequestURI();//获取资源地址
request.getQueryString();//获取地址后所跟的参数
request.getRemoteAddr();//获取来访者的ip地址
request.getRemotePort();//获取来访者端口
request.getMethod();//获取来访者的请求方式
request.getProtocol();//客户端的请求方式
获取请求消息头的内容:
获取请求消息头的所有名称:
Enumeration<String> e=request.getHeaderNames();
while(e.hasMoreElements()){
String str=e.nextElement();
System.out.println(str+":"+request.getHeader(str));
}
请求消息头:
accept:text/html, application/xhtml+xml, */*
accept-language:zh-CN
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
accept-encoding:gzip, deflate
host:localhost:8080
dnt:1
connection:Keep-Alive
获取客户端提交的参数(正文):
获取参数:
String str=request.getParameter("username");
当有两个相同name的参数时,用:
String []str=request.getParameterValues("password");
获取即可。
获取所有参数名称:
Enumeration e=request.getParameterNames();
用beanutils封装获取到的参数:
User us=new User();
BeanUtils.populate(us, request.getParameterMap());
System.out.println(us);
User为一个描述类,描述要封装的数据,
public class User {
private String username; //命名要与表单中的name中的命名相同
private int psw;
private String code;
public String getUesername() {
return username;
}
public void setUesername(String uesername) {
this.username = uesername;
}
public int getPsw() {
return psw;
}
public void setPsw(int psw) {
this.psw = psw;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Override
public String toString() {
return "User [uesername=" + username + ", psw=" + psw + ", code="
+ code + "]";
}
}
表单输入域的特点:
用beanutils封装表单中的资源时,有一点要注意:
封装前,描述类中的属性值都为null,
封装后,如果没有上传字段的属性,显示的是什么都没有,而不是null,
如果没有该字段,则显示的为null;
表单中的单选框和多选框如果没有选择,则根本不会向服务器传值,也显示的为null。
请求参数是中文:
知识点:浏览器当前是什么码表,就以什么码表向服务器传输
服务器以iso-8859-1 来解码
处理:post请求:response.setCharacterEncoding("UTF-8");
get请求:new String(name.getBytes("iso-8859-1"),"UTF-8");//name为:resquest.getparameter("name");
get请求方式无法用beanutils来封装,只能单个封装,所以推荐post请求。
请求重对象和请求转发:
请求重对象:二次请求,浏览器的行为,地址栏会发生变化。
请求转发:一次请求,服务器行为,地址栏不会发生变化
请求重对象:
方式一:
public class TextRequest2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//告知浏览器无法处理请求
response.setStatus(302);
response.setHeader("location", "/TextRequest/servlet/TextRequest3");
}
}
方式二:(推荐)
response.sendRedirect("/TextRequest/servlet/TextRequest3");
TextRequest2为请求重对象:源;TestRequest3为请求重对象目标
请求转发:
请求源:request.setAttribute("p", "ppp");
//请求转发方式一:用servletcontext转发
ServletContext sc=getServletContext();
RequestDispatcher rd=sc.getRequestDispatcher("/servlet/TextRequest3");
rd.forward(request, response);
用这种方式转发,路径必须以“/”开头,代表绝对路径,当前应用
请求目标:String str=(String)request.getAttribute("p");
//请求转发方式二:
RequestDispatcher rd=request.getRequestDispatcher("TextRequest3");
rd.forward(request, response);
这种方式转发,可以以“/”开头,表示绝对路径,也可以不以“/”开头,代表相对路径,
当不需要在目标对象中取得源中的对象时,使用请求重对象,否则使用请求转发。
包含:
源对象代码:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("哈哈");
RequestDispatcher rd=request.getRequestDispatcher("/servlet/TextRequest");
rd.include(request, response);
目标对象代码:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("哈哈");
URL的书写方式:
相对路径(不推荐)
绝对路径:
重对象:response.sendRedirect("/TextRequest/servlet/TextRequest3")
转发:request.getRequestDispatcher("/servlet/TextRequest");
超链接:<a href="/TextRequest/servlet/TextRequest3"/>
表单:<form action="/TextRequest/servlet/TextRequest3"></form>
总结:当连接是给客户端使用的,需要写当前应用,给服务器使用的,不需要写,“/”就代表当前应用