Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
**
1.1 什么是Servlet?(JSP = Servlet + HTML)
**
Servlet是JavaWeb的三(Servlet(控制器)、Filter(过滤器)、Listener(监听器))大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
① 接收请求数据;
② 处理请求;
③ 完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
**
1.2 实现Servlet有三种方式
**
① 实现javax.servlet.Servlet接口;
② 继承javax.servlet.GenericServlet类;
③ 继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
问题:有人就要问了,为什么开发Servlet有三种方法?
回答:应为Servlet这个技术不是一开始出现就那么成熟,他经历一个发展的阶段。
Servlet --> GenericServlet --> HttpServlet
request.getAttribute()和request.getParameter()区别
⭐重定向和页面转发;重定向不能定向到WEB-INF下的jsp中
页面转发req.getRequestDispatcher()可以通过路径访问WEB-INF下的jsp保护文件。
1.用途上:
request.getAttribute(), 一般用于获取request域对象的数据(在跳转之前把数据使用setAttribute来放到request对象上)
request.getParameter(), 一般用于获取客户端提交的参数
2.存储数据上:
request.getAttribute()可以获取Objcet对象
request.getParameter()只能获取字符串(这也是为什么它一般用于获取客户端提交的参数)
forward和redirect的区别
实际发生位置不同,地址栏不同
(1).转发是发生在服务器的
转发是由服务器进行跳转的,细心的朋友会发现,在转发的时候,浏览器的地址栏是没有发生变化的,在我访问Servlet111的时候,即使跳转到了Servlet222的页面,浏览器的地址还是Servlet111的。也就是说浏览器是不知道该跳转的动作,转发是对浏览器透明的。通过上面的转发时序图我们也可以发现,实现转发只是一次的http请求,一次转发中request和response对象都是同一个。这也解释了,为什么可以使用request作为域对象进行Servlet之间的通讯。
(2).重定向是发生在浏览器的
重定向是由浏览器进行跳转的,进行重定向跳转的时候,浏览器的地址会发生变化的。曾经介绍过:实现重定向的原理是由response的状态码和Location头组合而实现的。这是由浏览器进行的页面跳转实现重定向会发出两个http请求,request域对象是无效的,因为它不是同一个request对象
3.用法不同:
很多人都搞不清楚转发和重定向的时候,资源地址究竟怎么写。有的时候要把应用名写上,有的时候不用把应用名写上。很容易把人搞晕。记住一个原则: 给服务器用的直接从资源名开始写,给浏览器用的要把应用名写上
request.getRequestDispatcher("/资源名 URI").forward(request,response)
转发时"/"代表的是本应用程序的根目录【zhongfucheng】
response.send("/web应用/资源名 URI");
重定向时"/"代表的是webapps目录
4.能够去往的URL的范围不一样:
转发是服务器跳转只能去往当前web应用的资源
重定向是服务器跳转,可以去往任何的资源
5.传递数据的类型不同
转发的request对象可以传递各种类型的数据,包括对象
重定向只能传递字符串
6.跳转的时间不同
转发时:执行到跳转语句时就会立刻跳转
重定向:整个页面执行完之后才执行跳转
那么转发(forward)和重定向(redirect)使用哪一个?
根据上面说明了转发和重定向的区别也可以很容易概括出来。转发是带着转发前的请求的参数的。重定向是新的请求。
7.典型的应用场景:
转发: 访问 Servlet 处理业务逻辑,然后 forward 到 jsp 显示处理结果,浏览器里 URL 不变
重定向: 提交表单,处理成功后 redirect 到另一个 jsp,防止表单重复提交,浏览器里 URL 变了
**
Servlet生命周期
**
Servlet部署在容器里(应用服务器Tomcat,其他应用服务器,比如jboss,weblogic…),它的生命周期由容器来管理。
Servlet的生命周期分为以下几个阶段:(重点)
1.装载Servlet,由相应的Tomcat容器来完成
2.创建一个Servlet实例
3.调用Servlet的init()方法,该方法只会在第一次访问Servlet时被调用一次
4.服务:调用Servlet的service()方法,一般业务逻辑在这里处理,该方法在访问该Servlet时,会被调用
5.销毁:调用Servlet的destroy()方法,销毁该Servlet实例,该方法在以下情况被调用:
a.tomcat重新启动
b.reload该webapps
c.重新启动电脑
一个简单的登录系统测试Servlet
HTML
<div align="center">
<h1>首页</h1>
<hr>
<form action="servlet4" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="登录"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</div>
Servlet
public class Servlet4 extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("---init()---");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、接收数据
String userName = request.getParameter("userName");
String password = request.getParameter("password");
System.out.println("---------" + userName);
System.out.println("=========" + password);
if (userName.equals("admin")) {
// 正确
// 3、跳转页面
response.sendRedirect("view/mian.jsp");
} else {
// 错误
// 3、跳转页面
response.sendRedirect("login.jsp");
}
// 2、调用业务
// ?
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("--------doPost-----------");
this.doGet(request, response);
}
}
WEB XML配置
<servlet>
<servlet-name>servlet4(Servlet的文件名)</servlet-name>
<servlet-class>com.hqyj.servlet.test.Servlet4(Servlet的路径)</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet4(要与上文Servlet的name一致)</servlet-name>
<url-pattern>/servlet4</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.jsp(配置文件入口)</welcome-file>
</welcome-file-list>