一、servlet概念
servlet是运行在服务器端的应用程序,是由java编写,必须依赖于web容器(tomcat)运行,它的运行只能是由tomcat启动运行
客户端通过一个url地址访问该servlet,由tomcat去调用执行该servlet
二、servlet的生命周期
init()在servlet第一次加载的时候执行该方法,而且只会被执行一次
service() 执行,每调用一次servlet,就会执行一次service(),该方法不需要重写,该方法已经被父类实现,
由servcie去判断是调用doGet()还是doPost()
destroy() 在web容器(tomcat)关闭时,调用该方法,而该方法也是只会执行一次
三、servlet api
HttpServlet
doGet(HttpServeltRequest request , HttpServletResponse response){}
GenericServlet
service(ServletRequest req , ServletResponse res){}
ServletConfig Servlet Serializable
HttpSession session
ServletContext application
四、第一个servlet
public class MyServlet extends HttpServlet{
public void doGet(HttpServletRequest request , HttpServletResponse response){
//具体的功能实现
}
public void doPost(HttpServletRequest request , HttpServletResponse response){
doGet(request , response);
}
}
五、servlet的部署
两种部署方式:
(1)注解的方式,在servlet类的上面定义一个@WebServlet(部署的servlet的路径)
@WebServlet("/login/fs")
@WebServlet("/login/fs.do") 省略了value的属性名 @WebServlet(value="/login/fs.do")
@WebServlet(name = “abc”,value = “/admin/login.do”) 当有其他属性的时候,value属性名不能省略
@WebServlet(name = “abc”,urlpatterns ={ “/admin/login.do”,“/user/login.do”})
(2) web.xml配置servlet
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
</servlet>
<!-- @WebServlet(name = "abc",value = "/admin/login.do") -->
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/admin/login.do</url-pattern>
</servlet-mapping>
扩展:
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
</servlet>
<!-- @WebServlet(name = "abc",value = "/admin/login.do") -->
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/admin/login.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/admin/login2.do</url-pattern>
</servlet-mapping>
简化:
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/admin/login.do</url-pattern>
<url-pattern>/admin/login2.do</url-pattern>
<url-pattern>/admin/login3.do</url-pattern>
<url-pattern>/user/login4.do</url-pattern>
</servlet-mapping>
登录验证项目
login.jsp 表单可输入用户名和密码,点击确认登录
----》login.do(servlet) —>获取表单的数据用户名和密码并调用
—》LoginDao.java(jdbc连接数据库并校验用户名和密码)
-------》index.jsp 校验成功,
----->StudentDao.java(查询所有的学生并返回)跳转到主页index.jsp (显示表格,所有学生的信息)
-------》fail.jsp 校验失败,用户名密码错误
注意点:(1)页面的跳转 jsp—》servlet—》jsp
(2)jsp为了祛除java代码,使用el和jstl,就会使用到四大范围的值,请求转发和重定向所能支持的范围
六、参数设定
(1)上下文参数
web.xml
age
21
//在servlet中可以通过ServetContext获取context-param里的值
String age = getServletContext().getInitParameter(“age”);
(2)servlet的参数
只能该servlet访问 web.xml
abc
org.lanqiao.servlet.FirstServlet
age
22
//获取servlet的参数
String age2 = getInitParameter(“age”);
(3) servlet的启动顺序
默认的servlet,tomcat启动的时候并没有加载servlet,只有第一次访问servlet的时候,tomcat才加载该servlet
能不能只要一启动tomcat就先把servlet加载呢?
<load-on-startup>1</load-on-startup>
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>org.lanqiao.servlet.FirstServlet</servlet-class>
<init-param>
<param-name>age</param-name>
<param-value>22</param-value>
</init-param>
<!-- 一启动tomcat,该servlet就被加载到tomcat中了,执行了init(),正数的值越小,启动该servlet的优先级越高。 -->
<load-on-startup>1</load-on-startup>
</servlet>
七、过滤器Filter(类似servlet)
<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
<filter>
<filter-name>mf</filter-name>
<filter-class>org.lanqiao.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>mf</filter-name>
<!-- 拦截所有的url请求 -->
<url-pattern>*.do</url-pattern>
</filter-mapping>
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//HttpServletRequest req = (HttpServletRequest) request;
String encoding = request.getServletContext().getInitParameter("encoding");
//设置request对象中的数据为utf-8格式
request.setCharacterEncoding(encoding);
System.out.println("写入日志,"+request.getParameter("name")+"登录在"+new Date().toLocaleString());
chain.doFilter(request, response);
response.setCharacterEncoding(encoding);
System.out.println("写入日志,显示页面");
八、url路径映射
@WebServlet("/login.do")
/teacher/login.do
//一般用在过滤器中,这个会拦截该web应用中所有的请求都会通过该过滤器
//比如http://localhost:8888/test/login.jsp http://localhost:8888/test/hello.html http://localhost:8888/test/hello.jpg
/*
//只是拦截所有后缀是.do的请求
//只要后缀不是.do的请求的都不会拦截
*.do
/*.do //这样写是错误的