1.对于大型的项目,推荐实验weblogic
2.本小节重在学习Servlet的生命周期
3.访问项目时。form表单中地址的填写问题
4.请求转发和重定向的问题(涉及到url地址的不同转换)
5.属性的作用域问题
1.生命周期
1.生命周期:主要分为三个阶段
-
init初始化
-
service处理请求阶段
-
destory销毁阶段
只有完成了初始化的Servlet才能处理客户端的请求,有些时候爆出来空指针异常要考虑是不是没有初始化的问题。
请求响应阶段就是常写的doGet或者doPost方法等
处理完的请求发送给客户端,下一次请求无需init,直接去调用去处理请求就可以了
2.请求转发和重定向
请求转发是服务器内部发生的,转发客户端到来的请求。
重定向是客户端重现发起的一次请求,注意此时地址需要把包名带上,不然会出现404的效果。
请求转发的方式决定着后面处理的方式
2.1请求转发
1.登录案例
第一步:创建登录界面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
登录首页
<form action="login" method="GET">
账号:<input type="text" name="account"/> <br/>
密码:<input type="password" name="password"/> <br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
第二步:创建servlet
-
/login转到/LoginHandle去处理
@WebServlet("/login" )
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 调用post方法执行请求
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//
request.setCharacterEncoding("utf-8");
// 实现请求转发
request.getRequestDispatcher("/LoginHandle").forward(request, response);
}
}
-
/LoginHandle处理的界面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.append("Servlet2处理登录请求"+request.getParameter("account"));
}
运行截图:
2.2重定向
重定向会丢失原先的请求信息,而请求转发不会丢失原先的信息
第一步:LoginServlet设置重定向
-
需要设置包的名称,重新发送请求的过程
response.sendRedirect("/ch02-01.2/LoginHandle");
第二步:
System.out.append("Servlet2处理登录请求"+request.getParameter("account"));
运行截图:
2.3Servlet的作用域
常见的四种作用域,page,request,session,application。
对于Servlet来说,能用到的就是后面三个,对于jsp页面来说需要用到的就是这四个。
对于这个作用域的可能涉及到一个this的空指针异常,如果异常的话,异常的点就在Servlet没有进行初始化。
1.request
仅在请求对象中存在
2.session
当前的会话有效,关闭会话的窗口,当前的会话变量也是会随着消失的。
一次会话的过程可以认为,从浏览器打开到浏览器关闭就是一次会话的过程。
3.application
application就是请求的上下文对象,需要用到的就是ServletContext对象
4.作用域案例:
第一种测试:同一个页面下的信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置三种作用域变量
request.setAttribute("name1", "request作用域");
// 获取当前的session对象
HttpSession session=request.getSession();
// 设置当前会话的信息
session.setAttribute("name2","session作用域");
// 获取上下文对象
ServletContext application =request.getServletContext();
application.setAttribute("name3", "application作用域");
// 打印对应的作用域信息
System.out.println("name1-request---"+request.getAttribute("name1"));
System.out.println("name2-session---"+session.getAttribute("name2"));
System.out.println("name3-application---"+application.getAttribute("name3"));
}
-
运行截图: 三种对象的结果都是可以获取的
第二种:将请求转发到/test进行测试
@WebServlet("/test")
public class test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 打印对应的作用域信息
System.out.println("name1-request---"+request.getAttribute("name1"));
// 获取当前的session对象
HttpSession session=request.getSession();
// 设置当前会话的信息
session.setAttribute("name2","session作用域");
// 获取上下文对象
ServletContext application =request.getServletContext();
System.out.println("name2-session---"+session.getAttribute("name2"));
System.out.println("name3-application---"+application.getAttribute("name3"));
}
运行截图:
-
request请求为null,所以不是此次会话
第三种:采用重定向的方式