HttpServletRequest
一.什么是HttpServletRequest
当tomcat接收到客户端发送的请求后,tomcat将http请求的信息封装成HttpServletRequest对象,然后经过service()方法分发给doGet()方法和doPost()方法取调用。通过HttpServletRequest对象获取想要的请求中的信息。
二.HttpServletRequest有哪些方法
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的同意资源地位符(绝对路径)
getRemoteHost() 获取客户前端的ip地址
getHeader() 获取请求头
getParameter() 获取请求参数
getParameterValues() 获取请求参数(包括多个值)
getMethod() 获取方法的类型
getAttribute() 获取域对象
setAttribute() 设置域对象
getRequestDispatcher() 获取请求转发的对象
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("获取请求的资源路径="+req.getRequestURI());
System.out.println("获取请求的统一资源定位符(绝对路径)"+req.getRequestURL());
System.out.println("获取客户端的ip地址 "+req.getRemoteHost());
System.out.println("获取请求头"+req.getHeader("Accept"));
System.out.println("获取请求方式"+req.getMethod());
//当请求中有多个值时,请求的方式是localhost:8080/Servlet01/requestServlet?username=张三&username=李四
System.out.println("获取请求的参数"+req.getParameter("username"));
System.out.println("获取请求的参数(多个)"+req.getParameterValues("password"));
req.setAttribute("key","zhangsan");
System.out.println("获取域对象"+req.getAttribute("key"));
}
运行结果:
doGet请求中文参数乱码解决方式
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
}
doPost请求参数乱码解决方式
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("获取请求的参数"+req.getParameter("username"));
System.out.println("获取请求的参数(多个)“+Arrays.asList(req.getParameterValues("hobby")));
}
请求转发
什么是请求转发呢,请求转发就是服务器接收到请求后,从一个资源跳到另一个资源的操作的操作叫做请求转发,是服务器内部的操作。
转发的特点(重点):
1.转发只是一次请求。
2.地址栏里面的请求地址没有变
3.可以共享request域中的数据
4.可以访问Web-INF中的资源
5.不可以访问访问工程外的资源
测试请求转发的特点
1)servlet1接收到请求,在request域对象中setAttrubute数据 ,然后转发请求到servlet2中
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName=req.getParameter("userName");
System.out.println("获取客户端穿过来的参数="+userName);
req.setAttribute("key1","servlet程序一处理了");
//获取转发对象资源
RequestDispatcher dispatcher= req.getRequestDispatcher("/servlet2");
dispatcher.forward(req,resp);
}
}
servlet2中接收转发过来的请求,然后取request域中的数据,验证是否可以共享数据
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key= req.getAttribute("key1");
System.out.println("servlet1中的值是否存在"+key);
}
}
客户端发送请求后,地址没有变
servlet2中获取到了servlet1中存到request域中的数据,所有转发是可以共享数据的
2)接下来验证是否可以访问WEB-INF种的资源
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName=req.getParameter("userName");
System.out.println("获取客户端穿过来的参数="+userName);
req.setAttribute("key1","servlet程序一处理了");
//获取转发对象资源
RequestDispatcher dispatcher= req.getRequestDispatcher("/WEB-INF/hello.html");
dispatcher.forward(req,resp);
}
}
结果验证可以范文WEB-INF中的资源(值得注意的是getDispatcher()方法不一定是servlet的映射路径,也可以是html 或者jsp文件,或者说在tomcat中不管是html/jsp或者servlet编译后的class文件都是在文件夹中的一个文件而已)
3)不可以访问工程外的路径
重定向百度
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName=req.getParameter("userName");
System.out.println("获取客户端穿过来的参数="+userName);
req.setAttribute("key1","servlet程序一处理了");
//获取转发对象资源
RequestDispatcher dispatcher= req.getRequestDispatcher("https://www.baidu.com");
dispatcher.forward(req,resp);
}
}
结果:404(无法访问工程外的资源)
/在项目中解析的区别
1)/ 在浏览器端解析为http://ip:port/
2)/ 在服务器端解析为 http://ip:port/工程名/
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况 :斜杠在服务器端重定向时解析为 http://ip:port/ response.getRediect("/");
HttpServletResponse 类
什么是HttpServletResponse
HttpServletResponse和HttpServletResquest相同都是由tomcat创建,让我们使用,往客户端返回数据
字节流 ServletOutPutStream out=resp.getOutPutStream();(传输二进制数据,常用于下载)
字符流 PrintWriter writer =resp.getWriter()(传输字符,常用于客户端回传字符串)
resp.getOutPutStream()和resp.getWriter()同时使用只有有一个生效
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName=req.getParameter("userName");
System.out.println("获取客户端穿过来的参数="+userName);
Writer writer=resp.getWriter();
writer.write("writer context");
ServletOutputStream out= resp.getOutputStream();
out.println("ServletOutPutStream context");
}
}
只有一个生效
解决回传的数据中文乱码
//解决中文乱码
resp.setContentType(“text/html;charset=UTF-8”);
//解决中文乱码
resp.setContentType("text/html;charset=UTF-8");
重定向
resp.sendRedirect("/servlet2");
重定向的特点
1.客户端地址栏地址会变
2.发送两次请求
3.不共享域数据
4.不能访问WEB-INF下的资源
5.可以重定向项目外的路径
请求转发是request的方法,重定向是response的方法
重定向请求百度
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName=req.getParameter("userName");
System.out.println("获取客户端穿过来的参数="+userName);
resp.sendRedirect("http://www.baidu.com");
}
}