Servlet简介
servlet是Server Applet的简称,翻译过来就是服务程序.好吧,这么说你可能还是不太懂,简单的讲,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的.进一步讲,我们知道,一般的网页程序,是由我们通过浏览器访问来实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收请求,并对浏览器的请求作出相应的处理.这就是我们熟悉的B/S模型(浏览器-服务器模型).而servlet就是对请求作出处理的组件,运行于支持Java的应用服务器中.
Servlet的作用
在servlet刚刚出现的那个年代,servlet的作用十分复杂,既承担着处理数据的作用,又承担着展示页面的作用,美工人员想要参与开发,基本上是不太现实的,毕竟美工不可能再去花时间将页面做好.
随着时间的推移,出现了MVC思想,也就是模型-界面-控制器思想,极大的简便了开发,也明确了servlet的作用.
根据上面这张图,我们就能知道,servlet在其中承担的作用是controller,控制器,起到对数据进行操作的作用.
Servlet的开发流程
狭义上讲,servlet是servlet是java语言实现的一个类,所以我们就要根据这个类进行相应的扩展开发.
开发流程如下:
编写一个java类,继承HttpServlet类
重写HttpServlet类的doGet方法和doPost方法
配置web.xml文件,或者使用注解对servlet进行配置
- 使用web.xml文件配置
注意,servlet的配置内容要写在webapp内部
<webapp>
<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>MyServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>cn.roobtyan.servlet.FirstServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>MyServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
</webapp>
当你访问/first的时候,服务器自然就会把请求交给MyServlet进行处理了.
Servlet映射路径的配置问题
精确匹配
精确匹配就是我们上面用的那种方式,使用固定的url来访问这个servlet,这种没什么需要说明的
模糊匹配
模糊匹配就是比较有意思的了,通过模糊匹配,我们可以让好多路径映射到同一个servlet,模糊匹配一般有如下格式
/* 任意路径都映射到这个servlet
/roobtyan/* /roobtyan下的任意路径映射到该servlet
*.(*.do *.action *.html) 是这样的:/任意路径.do/action/html
这里面有两点是需要注意的,一是url要么以/开头,要么以*开头,其他的都是非法的
Servlet的生命周期
一般来讲,servlet只会初始化一次,也就是整个过程中只存在一个servlet对象,即便是有多次访问,依然只有一个对象,这个对象是可以复用的.我想你一定会好奇这个servlet究竟是在什么时候创建的,所以就来讲一下servlet的生命周期,所谓的生命周期我们在java基础知识中一定也了解过,就是servlet类究竟在什么时候创建,调用了何种方法,最后在什么时候被销毁.我们之前学过的对象都是自己手动创建,最后由JVM来销毁的,而servlet的整个生命周期,都是由tomacat,也就是服务器控制的
我们以一张图来了解一下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPYyFjZP-1588166662669)(http://img1.imgtn.bdimg.com/it/u=4065600391,1826098832&fm=214&gp=0.jpg)]
可以看到,servlet共有三个关键的方法,分别是init(),service(),destroy().
init方法只会调用一次,只是在创建servlet实例的时候才会创建
service方法,是进行数据处理的,只要接受了一次请求,就会被调用一次
destroy方法,销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,同样也是调用一次
#一个简单的例子
好了,讲了这么多,你一定是跃跃欲试了,我们就用一个登录控制的例子来简单的看一下servlet开发的步骤.
使用ide新建一个web项目
创建一个前端登录表单login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>roobtyan登录控制系统</title>
</head>
<body>
<h1 align="center" style="color: red;">欢迎您登录系统后台</h1><hr/>
<%--the form start--%>
<div align="center">
<form method="post" action="/login">
Username:<input type="text" name="username"/><br/><br/>
Password:<input type="password" name="password"/><br/><br/>
<input type="submit" value="登录"/>
</form>
</div>
</body>
</html>
- 创建一个登录成功页面
同样使用jsp页面
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>欢迎页面</title>
</head>
<body>
<h1 align="center" style="color: red">Welcome:</h1>
<%
out.println(session.getAttribute("user"));
%>
<hr/>
<span style="align:center; color:yellow">
Time:<%
out.println(new Date());
%>
</span>
</body>
</html>
- 创建LoginServlet.java
public class LoginServlet extends HttpServlet {
public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
request.setCharacterEncoding("utf8");
//从request对象中获取username,password
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断是否为管理员
if("administrator".equals(username)&&"123456".equals(password)){
//登录成功,设置session
HttpSession session = request.getSession(true);
session.setAttribute("user", "管理员,欢迎你!");
}else {
session.setAttribute("user","登录信息错误,请检查用户名或密码");
}
//将页面转发到欢迎页面
requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
requestDispatcher.forward(request,response);
}
}
配置servlet
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.roobtyan.cn.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>