请求响应对象
HttpServletRequest
继承于servletRequest用于处理http请求,并将请求的数据进行解析后保存在当前对象中
HttpServletRequest作用:
为HttpServlet提供请求信息
继承自javax.servlet.ServletRequest接口
从ServletRequest继承而来的常用方法有:
方法 | 用途 |
---|---|
getAttribute(String name) | 获取属性值 |
setAttribute(String name, Object o) | 设置属性值 |
getCharacterEncoding() | 获取字符编码集 |
setCharacterEncoding(String env) | 设置字符编码集 |
getParameter(String name) | 获取参数的值 |
getParameterValues(String name) | 获取参数的多个值 |
getRemoteAddr() | 获取客户端IP地址 |
getRequestDispatcher(String path) | 构建一个转发对象 |
getCookies() | 获取cookie数组 |
---|---|
getHeader(String name) | 获取HTTP请求头信息 |
getRequestURL() | 获取URL |
getQueryString() | 获取QueryString |
getSession() | 获取或构建会话 |
HttpServletResponse
继承于servleResponse用于处理http响应,并将响应输出对象存储在response对象中
HttpServletResponse提供了一些HTTP响应常用的方法:
方法 | 用途 |
---|---|
setContentType(String type) | 设置内容类型 |
addCookie(Cookie cookie) | 设置客户端Cookie |
setHeader(String name,String value) | 设置响应头信息 |
sendRedirect(String location) | 设置跳转页面 |
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 在获取指定数据之前需要将指定数据进行编码(转换为当前编码)
// 将请求对象中的数据进行编码转换
request.setCharacterEncoding("utf-8");
// 将相应对象中的数据进行编码转换
response.setCharacterEncoding("utf-8");
// 告诉客户端服务器响应的数据类型
response.setContentType("text/html;charset=utf-8");
// 从request对象 获取请求数据
// 根据请求获取请求对象中客户端传输的数据 根据form表单对应name进行获取
String username = request.getParameter("username");
String password = request.getParameter("password");
// 当form表单提交相同name多个值时使用getParameterValues获取
String[] values = request.getParameterValues("like");
System.out.println(Arrays.toString(values));
// 获取客户端请求ip
String remoteAddr = request.getRemoteAddr();
System.out.println(username + "|" + password + "|" + remoteAddr);
// PrintWriter writer = response.getWriter();
// writer.print("不会乱码 ");
//请求转发
//使用requset请求对象创建转发对象然后将请求进行转发
//request.getRequestDispatcher("form.html").forward(request, response);
//重定向请求
//使用response对象进行重定向
//response.sendRedirect("form.html");
}
get请求与post请求的区别
1、请求数据携带位置不同
get请求数据在url地址上传输
post请求数据在请求体中传输
2、数据携带量大小不同
get请求由于在url地址上传输所以传输大小受url地址栏大小限制,通常为2k,但是实际大小根据不同浏览器本身进行限制
post请求传输大小不是没有限制只不过对于get请求而言很大
3、服务器接收数据方式不同
get请求数据服务器主动接收
post请求数据服务器被动接收
4、安全性不同
get请求在地址栏传输数据不安全
post请求虽然在请求头中传输但相比较get请求安全
请求转发与重定向的区别
1、请求后url地址不同
转发时请求的服务是那个那个url地址栏就是哪一个
重定向为最终请求的位置的url
2、请求次数不同
请求转发请求一次
重定向至少请求2次
3、请求响应状态吗不同
请求转发响应状态码为200
重定向响应状态码为302直至请求至最后一个请求响应200
4、安全性不同
请求转发属于内部转发行为与外部请求无关,所以可以访问服务器内部资源
重定向属于外部再次请求,不能访问服务器内部资源
5、数据携带不同
请求转发会将请求的请求数据进行携带
重定向相当于重新请求会产生新的请求对象不会携带之前请求的数据
使用servlet作为controller层进行处理,mvc+dao设计模式
m-model层
使用dao设计模式
pojo:用于存储存放数据的对象的类
dao:用于存储对数据库操作的方法接口
daoimpl:用于存放对应实现方法的类
c-controller控制层
controller:用于负责页面的返回与跳转
将控制层额外分出服务层service
service:用于相应服务与dao层方法之间的映射,并处理dao层返回的数据的抽象方法
serviceimpl:具体实现方法
v-view视图层
将项目页面存储在webcontext下,如果不想外部直接方法存在WEB-INF下
使用分层结构的优点:
减少代码的冗余,提高代码的复用性
减少开发过程中出现问题解决问题的过程,每层负责单独的功能,如果出现问题可以快速的定位到相应的层进行解决
1.页面跳转不对->controller
2.页面展示数据不对->service
3.判断逻辑问题
cookie与session
会话:客户端浏览器与服务器发生的一连串的请求与响应的过程称之为一次会话
当客户端关闭当前会话的浏览器时会话结束(理解)
为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。
Cookie
当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
当客户端请求服务器需要返回cookie时,服务器会创建cookie对象并将响应数据存入并设置相应属性,之后将cookie响应发送给客户端
当携带cookie的客户端请求服务器端时,请求对象会自动解析对应的cookie对象进行存储,只需要调用请求对象对应方法获取cookie数据即可
Cookie的工作原理可这样描述
1)首先浏览器向服务器发出请求。
2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。
3)然后把该Cookie对象放在响应头,一并发送回浏览器。
4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。
5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。
6 ) 服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。
进行cookie数据保存时可能会出现乱码问题,所以进行保存前应先进行编码
设置Cookie中文:URLEncoder(编码),URLDecoder(解码)
URLEncoder.encode(“张三”, “UTF-8”);//编码
URLDecoder.decode(cookie.getValue(), “UTF-8”);//解码
cookie的添加
//创建cookie对象
String encode = URLEncoder.encode("李四", "utf-8");
Cookie cookie=new Cookie("username", encode);
//将cookie发送至客户端
response.addCookie(cookie);
cookie的修改与删除
cookie存储在客户端所以服务器只能使用修改相应属性的形式进行操作,修改就是进行覆盖,删除就是删除对应的value的值或者设置cookie的存活时间
//清除Cookie
Cookie cookie = new Cookie("username", "");
//1:设置访问的路径path, 这里的Path必须和设置Cookie 的路径保持一致
cookie.setPath(request.getContextPath());
//2:设置存活时间
cookie.setMaxAge(0);
//3:将cookie发送到浏览器
response.addCookie(cookie);
//删除cookie就是将指定cookie存活时间设置为0让浏览器删除
cookie的获取
//cookie查询
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
//使用解码对象将数据解码
String decode = URLDecoder.decode(c.getValue(), "utf-8");
System.out.println(c.getName()+":"+decode);
}
cookie的持久化时间
注意:由于保存在客户端,有的浏览器不允许未知网站进行cookie的持久化存储,但是可以进行临时存储
Cookie cookie = new Cookie("username", "lisi");
/*
* 1:默认情况下,Cookie的生命周期是从发送Cookie到浏览器结束(关闭浏览器)
* 2:如果要对Cookie持久化,必须设置Cookie的存活时间,则Cookie存到硬盘中 setMaxAge(expiry) 单位是秒
* 3:如果持久化了之后,浏览器关闭之后重启可以重新获取
*/
// cookie的默认持久化周期为-1 (如果没有显式的设置持久化周期默认为-1)
// 如果为负数那么结果相同
cookie.setMaxAge(5000); // 单位是秒
response.addCookie(cookie);
// cookie查询
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
// 使用解码对象将数据解码
System.out.println(c.getName() + ":" +c.getValue());
}
cookie的作用域
cookie保存到客户端之后,不同浏览器对于不同cookie进行获取,默认情况下客户端在请求时只会携带指定服务器的cookie(可以对作用域进行设置限制cookie的携带,但只能限制于当前服务器)
Cookie cookie = new Cookie("username", "wangwu");
// 设置Cookie访问路径:path
// 1:只要访问同一个Tomcat中所有的项目资源,都会携带Cookie默认
// cookie.setPath("/");
// 2:只要访问我当前项目中的所有资源,都会携带Cookie1
// cookie.setPath("/AiTest/");
// 3:只要访问我当前项目中的abc目录下所有资源,都会携带Cookie
// cookie.setPath("/AiTest/abc");
// 设置当前项目为作用域
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
使用cookie实现购物车
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShoppingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String parameter = request.getParameter("show");
// 获取cookie对象
int count = 0;
// 获取保存购物车商品列表的cookie
Cookie[] cookies = request.getCookies();
Cookie shoopingCookie = null;// 用于从指定cookie集合中获取保存购物车商品列表的cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("shoopingCookie")) {
shoopingCookie = cookie;
}
}
}
// 购物车为空
if (shoopingCookie != null) {
String value = shoopingCookie.getValue();
String[] split = value.split("/");
count = split.length;
}
PrintWriter writer = response.getWriter();
if (parameter == null) {
writer.print("<form action='shop' method='post'>");
writer.print("<input type='text' name='shopping' placeholder='请输入商品名称'>");
writer.print(" <input type='submit' value='添加至购物车'>");
writer.print(" 购物车商品数量:" + count);
writer.print(" </form>");
writer.print("<a href='shop?show=1'>查看购物车</a>");
} else {
// 书写购物车信息
writer.print("购物车商品:"+shoopingCookie.getValue());
writer.print("<a href='javascript:history.go(-1)'>返回</a>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获取添加的商品名
String shopping = request.getParameter("shopping");
// 获取保存购物车商品列表的cookie
Cookie[] cookies = request.getCookies();
Cookie shoopingCookie = null;// 用于从指定cookie集合中获取保存购物车商品列表的cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("shoopingCookie")) {
shoopingCookie = cookie;
}
}
}
// 购物车为空
if (shoopingCookie == null) {
shoopingCookie = new Cookie("shoopingCookie", shopping);
} else {
shoopingCookie = new Cookie("shoopingCookie", shoopingCookie.getValue() + "/" + shopping);
}
// System.out.println(shoopingCookie.getValue());
response.addCookie(shoopingCookie);
response.sendRedirect("shop");
}
}