2022-09-01 第六小组 张宁杰 request&response
HttpServletRequest // 请求
所有和请求相关的操作
当请求来的时候,request就被实例化
HttpServletResponse // 响应
所有和响应的操作
当请求来的时候,response就被实例化
服务端给出响应
// 中文处理,设置响应的字符集
// 放在获取流之前
response.setCharacterEncoding("utf-8");
// 添加响应头,告诉浏览器以html格式来解析响应字符串
response.addHeader("content-type","text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write("a");
out.flush();
out.close();
路径匹配
路径匹配:必须有 /
扩展名匹配:不能有 /
反例:/user/*.do hello/user.do
默认匹配:<url-pattren>/</url-pattren>
路径匹配和扩展名无法同时设置
/ 和 /* 的区别
/* 属于路径匹配,可以匹配所有的请求,路径匹配优先级仅次于精确匹配 ,会覆盖所有的扩展名匹配
/ 是 servlet 中特殊的匹配模式,优先级最低,不会覆盖任何的 url-pattren ,匹配所有的请求
搜可以拦截静态资源
servlet加载时期
inti 方法什么时候执行:当第一次访问 servlet 的时候被调用,延迟加载
初始化方法只执行一次,
设置启动就加载
@WebServlet(value = "/hello.do", loadOnStartup = 1)
常见传参有2种:
get , post
浏览器地址栏直接输入是 get
超级链接:get
表单:可以是 ge t或 post
GET 和 POST 区别
GET :参数会在地址栏显示出来,不安全,请求长度限制为1 K 之内,没有请求体,无法通过 request 设置一些参数
POST :请求的参数不会在浏览器地址栏显示,相对安全,把请求的参数封装成一个数据报文(请求体),请求参数长度没有限制
获取一个key对应的多个值
//根据key获取对应value
req.getParameter("");
// 获取一个Key对应的多个值,返回值为String类型的数组
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
// 获取传过来的 key 值,可根据key值获取对应value值
Enumeration<String> parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
// 可以获取到请求中的所有的键值对
// 这个map集合的key是String,value是String[]
// name=a,pass=a,hobby=o,s,f,gender=man
Map<String, String[]> map = req.getParameterMap();
for (Map.Entry<String, String[]> name : map.entrySet()) {
String key = name.getKey();
String[] value = name.getValue();
System.out.printf(key + " ---> " + Arrays.toString(value));
}
请求转发
请求转发是在服务器上完成的,跟客户端无关
req.getRequestDispatcher("zhuan1.do").forward(req,resp);
@WebServlet("/zhuan.do")
public class ZhuanFaServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 请求转发 --- 由多个servlet来处理一个请求
*/
String name= req.getParameter("name");
// 要传一个参数,转发的servlet地址
req.getRequestDispatcher("zhuan1.do").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
@WebServlet("/zhuan1.do")
public class ZhuanFa1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name= req.getParameter("name");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
作用域
@WebServlet("/zuoyongyu.do")
public class ZuoYongYuServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 作用域
* 往request作用域中添加了属性name对应的值是zhangsan
* 请求转发的时候是同一个request
*
*/
req.setAttribute("name","zhangsan");
// 取出
System.out.println(req.getAttribute("name"));
req.getRequestDispatcher("zuoyongyu1.do").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
其他方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 根据key删除value
req.removeAttribute("name");
// 获取req作用域种所有的key
Enumeration<String> attributeNames = req.getAttributeNames();
}
Response的方法
resp.getWriter();
resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type","text/html;charset=utf-8");
// 重定向
resp.sendRedirect("a.html");
重定向和请求转发的区别
1.重定向是2次请求,请求转发是一次请求
2.重定向是客户端行为,请求转发是服务器行为
3.重定向是浏览器地址会改变,转发不会
4.重定向可以到任意地址,转发之能在项目内转发