Request与Respons
Servlet之Request:
常用方法:
- getRequestURL:获取客户端的完整URL
- getRequesURI:获取请求行中的资源名部分
- getQueryString:获取请求行的参数部分
- getMethod:获取请求方式
- getSchema:获取请求的协议
- getRemoteAddr:获取客户端的ip地址
- getRemoteHost:获取客户端的完整主机名
- getRemotePort:获取客户端的网络端口号
package com.wp;/*
*@author wupeng
*@time 2021/6/21-11:55
HttpServler用来存放客户端请求的参数
请求行
请求头
请求体
*/
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/request")
public class RequestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
this.doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求");
/*
获取请求行数据
*/
//获取请求方式
String method = req.getMethod();
System.out.println(method);
//获取请求的完整地址
StringBuffer url = req.getRequestURL();
System.out.println(url);
//获取资源路径
String requestURI = req.getRequestURI();
System.out.println(requestURI);
String schema = req.getScheme();
System.out.println(schema);
/*
获取请求头数据
根据Key获取value
*/
String header = req.getHeader("User-Agent");
System.out.println(header);
//获取请求头信息中的所有key的枚举对象
Enumeration<String> headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()) {
String key = headerNames.nextElement();
String value = req.getHeader(key);
// System.out.println(headerNames.nextElement());
System.out.println(key+" "+value);
}
/*获取用户请求
无论请求方式是Post还是Get,获取用户数据的方式不变
*/
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
System.out.println(name);
System.out.println("pwd");
//获取用户数据中的所有key
Enumeration<String> parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()) {
System.out.println(parameterNames.nextElement());
}
//获取相同key的多个数据值,例如checkbox
String[] favs = req.getParameterValues("fav");
for(String f:favs) {
System.out.println(f);
}
//其他常用方法
//获取请求行参数
String queryString = req.getQueryString();
System.out.println(queryString);
// - getSchema:获取请求的协议
String scheme = req.getScheme();
System.out.println(schema);
// - getRemoteAddr:获取客户端的ip地址
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);
// - getRemoteHost:获取客户端的完整主机名
String remoteHost = req.getRemoteHost();
System.out.println(remoteHost);
// - getRemotePort:获取客户端的网络端口号
int remotePort = req.getRemotePort();
System.out.println(remotePort);
}
}
Servlet之Respons:
HttpServletResponse对象是服务器的响应对象,这个对象中封装了向客户端发送数据,发送响应头,发送响应状态码的方法
服务器的一个响应对象,
- 设置响应头
- setHeader(String key,String value)添加响应信息,key重复会覆盖
- addHeader(String key,String value)添加响应信息,key重复不会覆盖
- 设置响应状态
- sendError(int num,String msg)添加响应状态
- 设置响应实体
- getWriter().write(msg)响应具体的数据给浏览器
代码:
package com.wp;/*
*@author wupeng
*@time 2021/6/21-20:26
response:表示服务端返回数据的响应对象,
响应头:
响应行:
响应体:
*/
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/response")
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is get");
/*设置响应头,按照key-value键值对的方式来设置
如果存在相同的key两者都可以添加,set会进行覆盖,add不会进行覆盖
*/
resp.setHeader("hehe","haha");
resp.addHeader("beijing","shanghai");
// 添加响应状态
resp.sendError(404,"not found");
// 响应具体的数据给浏览器
resp.getWriter().write("写入");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("this is post");
this.doGet(req, resp);
}
}
实现小项目实现:
登录小项目流程:
1.使用原生的方式生成页面
2.客户端先发送请求
3.用户填写相应的用户数据,发送请求给服务器
4.服务端将收到的请求后进行逻辑处理
5.服务端将处理之后的结果返回给客户端
乱码问题解决:
1、使用String重新进行编码
String name = new String(name.getBytes("ios-8859-1"),"utf-8")
2、get请求乱码
- request.setCharacterEncoding("utf-8");
- 在server.xml中添加属性useBodyEncodingForURl=true
3.post请求乱码
request.setCharacterEncoding("utf-8");
4.response乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8")
Servlet请求转发和重定向:
登录失败之后重新定位到登录页面,
重定向和请求转发的区别?
Servet request作用域:
不同Servlet之间如何实现数据共享?
request.setAttribute(Object key,Object value)
request.getAttribute(Object key)
重定向:
①浏览器发送两次请求
②浏览器的地址发生变化
③请求过程产生两个request对象和两个response对象
④两个servlet不能共享同一个request和response对象