Servlet总结2
HttpServletRequest类
HttpServletRequest类有什么用?
当有请求进入Tomcat服务器时,Tomcat服务器就会把用户请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有用户请求的对象。
HttpServletRequest类的常用方法
request.getRequestURL(); 获取请求的统一资源定位符(绝对路径)
request.getRequestURI(); 获取请求的资源路径
request.getRemoteHost(); 获取客户端ip地址
request.getHeader(); 获取请求头
request.getParameter(); 获取请求的参数
request.getParameterValues(); 获取请求的参数(多个值的时候使用)
request.getMethod(); 获取请求的方式GET或POST
request.setAttribute(key,value); 设置域数据
request.getAttribute(key); 设置域数据
request.getRequestDispatcher() 获取请求转发对象
如何获取用户的请求参数
表单提交数据:
<body>
<form action="http://localhost:8080/WebTest" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="hobby" value="cpp">C++
兴趣爱好:<input type="checkbox" name="hobby" value="java">Java
<input type="submit">
</form>
</body>
Java代码:
public class HelloServlet3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+ Arrays.asList(hobby));
}
}
Get请求的中文乱码解决:
//获取请求参数
String username = request.getParameter("username");
//1.先以iso8859-1进行编码
//2.再以utf-8进行编码
username = new String(username.getBytes("iso-8859-1"),"UTF-8");
POST请求的中文乱码解决
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
...
...
}
请求转发:从一个资源跳到另一个资源
请求转发地址栏上的url不变
request.getRequestDispatcher() 获取请求转发对象
servlet1代码:
servlet2代码:
HttpServletResponse类
HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。
输出流
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个,同时使用会报错。
如何往客户端回传数据
:往客户端回传 字符串 数据。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//往客户端回传 字符串 数据。
PrintWriter writer = response.getWriter();
writer.write("response's content!!!");
}
响应的乱码 解决
//使用UTF-8,设置响应头
//此方法一定要在获取流对象之前调用才有效
response.setContentType("text/html;charset=UFT-8");
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一些地址。你去新地址访问,叫请求重定向(因为之前的地址可能已经被废弃)。//随着时间的推移和项目的不断更新,这个接口被废弃了,由新的接口所取代。
请求重定向的特点:
1.浏览器地址栏会发生变化
2.两次请求
3.不共享Request域中数据
4.不能访问WEB-INF下的资源
5.可以访问工程外的资源
请求重定向的第一种方案:
//设置响应状态码302,表示重定向(已搬迁)
response.setStatue(302);
//设置响应头,说明 新的地址在哪里
response.setHeader("Location","http://localhost:8080");
请求重定向的第二种方案:
response.sedRedirect("http://localhost:8080");
请求转发和重定向的区别
1.请求转发是在服务器内部的跳转,整个过程中只有1个请求,重定向是在客户端的跳转,产生了新请求
2.请求转发后,地址栏上的url不变,可以继续使用request中的数据,而重定向后,url会改变,就不能使用原request中的数据
3.请求转发只能跳转到服务内部的资源,重定向可以访问服务器外部的资源