基于Tomcat,提供的Request和Response对象
Request请求
请求代表用户通过浏览器访问服务器(浏览器→服务器)
开发人员(我们)需要:获取 请求行 请求头 请求体 相关信息
获取请求行
获取请求头
方法
说明
getMethod();
获取请求方法
getContextPath();
获取当前应用发布名称
(发布时写的那个 / ,但是打印是””空)
getRequestURL();
获取请求资源的URL
getRequestURI();
获取请求资源URI
getProtocol();
获取使用的协议
getRemoteAddr();
getRemotePort();
获取来访者信息:地址 端口号
getLocalAddr();
getLocalPort();
获取本地信息:地址 端口号
方法
说明
getHeader("Xxx");
获取消息头的值
getHeaderNames();
获取所有消息头名称的枚举
Enumeration<String> headerNames = req.getHeaderNames(); //遍历枚举 while (headerNames.hasMoreElements()){ String headerName = headerNames.nextElement(); //取出消息头 String headerValue = req.getHeader(headerName); //根据名称获取值 System.out.println("消息头名称是:"+headerName+",消息头的值是:"+headerValue); }
获取请求参数
解决中文乱码问题:req.setCharacterEncoding("UTF-8");
提取HTML文件中name属性
方法
说明
String getParameter
(String name);
根据参数名获得参数值(单个)
String[] getParameterValues
(String name);
根据参数名获得参数值(数组)
Map<String, String []>
getParameterMap();
获得所有的参数,封装到Map集合
Enumeration<String> getParameterNames();
获得所有请求参数名称的枚举
实体类封装
pom.xml导入Beanutils依赖,进行实体类封装,name取值和实体类属性相同
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency>
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决请求参数中文乱码问题 req.setCharacterEncoding("UTF-8"); //1.创建要封装的对象 User user = new User(); try{ //2.把请求参数的map封装到user对象中 BeanUtils.populate(user,req.getParameterMap()); }catch (Exception e){ e.printStackTrace(); } //3.输出 System.out.println("封装对象是:"+user); }
流读取
pom.xml导入hutool依赖,完成读取,服务器会给我们关流
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.6.4</version> </dependency>
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取请求对象的字节输入流 ServletInputStream in = req.getInputStream(); //2.流的操作 String str = IoUtil.read(in, "UTF-8"); System.out.println("用流读到的请求正文是:"+str); }
请求转发
一次请求在服务器内部资源之间跳转方式
浏览器 → servlet A → servlet B (A到B达成目的)
WEB-INF可以请求转发,但是浏览器不能直接访问其目录下资源
1.获取转发对象 RequestDispatcher dispatcher = req.getRequestDispatcher("/Xxx");//参数写的就是转发的目的地 2.真正完成转发 dispatcher.forward(req,resp);
共享数据
方法
说明
void setAttribute (String name, Object value)
向request域放入数据
object getAttribute (String name)
根据name从向request域获取数据
void removeAttribute (String name)
根据name从request域删除数据
Response响应
响应代表浏览器对用户的结果反馈(服务器→浏览器)
开发人员(我们)需要:设置响应状态码 响应消息头 响应正文相关信息
解决中文乱码:原理设置和显示不是一个码表
resp.setContentType("text/html;charset=UTF-8");
service只能使用字节流或者字符流其中的一种
//1.使用响应对象获取字节流 ServletOutputStream out = resp.getOutputStream(); //2.使用字节流输出正文 out.write("<h1>你好啊!</h1>".getBytes("UTF-8"));
//1.使用响应对象获取字符流 PrintWriter out = resp.getWriter(); //2.使用字符流输出正文 out.write("<h1>你好啊!</h1>");
使用字节流生成验证码(后面铺底)
表单
<form method="post" action="/responseDemo3"> 姓名:<input type="text" name="username"></br> 密码:<input type="password" name="password"></br> <img src="/responseDemo3" width="200" height="50"/></b> <!--浏览器遇到script标签和link标签img标签会自动向服务器发送请求--> <input type="submit" value="提交"> </form>
pom.xml导入hutool依赖
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.创建验证码对象 LineCaptcha lineCaptcha = new LineCaptcha(200,30,6,10); //2.使用验证码对象中提供的输出把,把字节输出流传递进去 lineCaptcha.write(resp.getOutputStream()); }
响应重定向
重定向方法
//1.设置响应消息头 resp.setHeader("Location","/responseDemo5"); //2.设置响应状态码 resp.setStatus(302);
简化方法
resp.sendRedirect("/responseDemo5");
请求转发 响应重定向
请求转发:
一次请求 只能方法应用资源 地址栏显示转发的地址 可以使用请求共享区 服务器完成
响应重定向:
二次请求 可以定向外部资源 地址栏显示重定向地址 请求共享区数据丢失 浏览器完成