什么是servlet?
交互式处理客户端发送到服务器的请求,并完成操作相应。
动态响应网页
作用:
servlet的体系结构 extends HttpServlet
两个父类 : HttpServletRequest , HttpServletResponse
两个父接口 : request, response
servlet的生命周期
前置条件:
tomcat 在启动时,检测web.xml和注解 ,是否有load-on-startup为0 或正数的servlet
如果有 : 调用getServletConfig() 找配置信息 getServletContext()找到具体包下的servlet。
如果没有 : 在请求的时候,调用getServletConfig() 找配置信息 getServletContext()找到具体包下的servlet
servlet的配置方式
3.0之前 使用web.xml
3.0之后 使用注解
@WebServlet(name = "OrderServlet" ,value = "/orderServlet")
request常用方法:请求对象
response常用方法: 响应对象
转发与重定向区别:
重定向:作用在客户端,相当于客户端发出一个新的请求
地址栏会显示重定向之后的路径
重定向后的servlet无法获取之前servlet里的数据
因为在HTTP协议中,不同请求之间的数据不共享
get请求 doGet
转发:作用在服务器端,是一次请求内的跳转
地址栏不会感知变化
由于在一次请求内,servlet之间数据共享
和之前请求方式相同
Cookie
原理
创建cookie
//创建cookie
Cookie cookie = new Cookie("code",code);
cookie.setPath(""); //设置路径
cookie.setMaxAge(); // >0 有效期为秒,=0浏览器关闭,<0 内存存储,默认为-1
response。addCookie(cookie); //添加到response对象中,响应时发送给客户端
获取Cookie
//获取Cookie
Cookie cookie=resquest.getCookie();
//遍历
for(Cookie cookie01:cookie){
if(cookie01.getName().equal("code")){
code=cookie01.getValue();
break;
}
}
优点:
缺点:
Session:
定义:
原理:
//获取session对象
Httpsession session=request.getSession();
//保存数据
setAtribute("key",value);
//获取数据
session.getAttribute("key");
Cookie 和 session的区别
简化servlet:设置BaseServlet,避免创建多个servlet,可以让新建的servlet继承BaseServlet,不需继承HttpServlet。
public class BaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取前端请求的方法的名字
String methodname=request.getParameter("method");
try {
//判断是否获取到方法名
if(methodname!=null) {
//利用反射机制,找到方法所在的类,调用对应的方法
//反射
Method method = this.getClass().getMethod(methodname, HttpServletRequest.class, HttpServletResponse.class);
if (method != null) {
//调用方法,方法返回的是视图名
//返回结果:是servlet子类中的方法的返回值,
// return "forward/redirect:login.jsp";
String url = (String) method.invoke(this, request, response);
if (url != null && url != "") {
//截取到有效路径 获取 forward:后面的内容
String pagePath = url.split(":")[1];
if (url.startsWith("forward:")) {
request.getRequestDispatcher(pagePath).forward(request, response);
} else if (url.startsWith("redirect:")) {
//重定向
response.sendRedirect(pagePath);
} else {
//响应AJAX数据
response.getWriter().print(url);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("没有调用的方法:"+e.getMessage());
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Get 和 post 区别
GET请求:
POST请求:
HTTP协议 三次握手 四次挥手
通信流程: