HttpServletResquest知识:html
Request的主要方法:
request.getRequestURL().toString();//获取URL地址:URL:协议,主机,资源地址
request.getRequestURI();//获取资源地址
request.getQueryString();//获取地址后所跟的参数
request.getRemoteAddr();//获取来访者的ip地址
request.getRemotePort();//获取来访者端口
request.getMethod();//获取来访者的请求方式
request.getProtocol();//客户端的请求方式浏览器
获取请求消息头的内容:服务器
获取请求消息头的全部名称:app
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-Aliveide
获取客户端提交的参数(正文):
获取参数:
String str=request.getParameter("username");post
当有两个相同name的参数时,用:
String []str=request.getParameterValues("password");
获取便可。this
获取全部参数名称:
Enumeration e=request.getParameterNames();spa
用beanutils封装获取到的参数:code
User us=new User();
BeanUtils.populate(us, request.getParameterMap());
System.out.println(us);orm
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>总结:当链接是给客户端使用的,须要写当前应用,给服务器使用的,不须要写,“/”就表明当前应用