01Web 应用服务器:
Tomcat、Jboss、webloic、Jetty
01Tomcat
bin:存放各种平台下启动和停止 Tomcat 服务的脚本文件
conf:存放 Tomcat 服务器配置文件
lib:存放运行Tomcat 服务需要的 jar 文件
logs:存放 Tomcat 运行的日志文件
temp:存放 Tomcat 运行时的临时文件
webapps:存放允许客户端访问的资源
work:存放 JSP 生成的 Servlet
Tomcat 常遇到的异常:
org.apache.catalina.LifecycleException,生命周期异常
02Servlet
三种创建方式,GenericServlet
三大域:application,request,session
Servlet 可以完成以下功能:
- 创建并返回基于客户端请求的动态 HTML 页面。
- 与数据库进行通信。
03过滤器(Filter)
-对请求和响应进行统一处理
-对请求进行日志记录和审核
-对数据进行屏蔽和替换
-对数据进行加密和解密
一.工作流程:
1、过滤器是服务端代码,用于拦截传入的请求和传出的响应。
2、监听、修改或者以某种方式处理正在客户端与服务器之间交换的数据流。
java8接口新特性: 例如:一个接口->20个实现类,不用20个都改。
default void test1(){
}
二.Filter API:
1、init(FilterConfig cf),类似于 Servlet 的 init,只调用一次,FilterConfig 类似于 ServletConfig,获取当前 Filter 的基本信息。
<filter>
<filter-name>test</filter-name>
<filter-class>com.m.filter.TestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
System.out.println(cf.getInitParameter("charset"));
2、doFilter()
类似于 Servlet 的 service,过滤器的主要业务逻辑写在该方法中,多次调用,只要有请求、响应被捕获,就调用一次。
FilterChain:过滤器链,让请求或者响应继续向下传递。
3、destory()
类似于 Servlet 的 destory,当 Web 应用程序关闭时调用,只调用一次,释放资源。
三.过滤器的应用:
- 对请求编码进行统一设置
- 屏蔽敏感词
(1) jsp
<form action="word.do" method="post">
<table>
<tr>
<td>用户名: </td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
(2)Filter
@WebFilter("/word.do")
public class WordFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
username = username.replaceAll("敏感词","***");
request.setAttribute("username",username);
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("word.do1");
}
@Override
public void destroy() {
System.out.println("word.do2");
}
}
(3) Servlet
@WebServlet("/word.do")
public class TestServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get1");
this.doPost(req, resp);
System.out.println("get2");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = (String) req.getAttribute("username");
System.out.println(username);
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("进入了Servlet");
out.println(username);
}
}
4.Open session in view (Struts2)
(1)可以不必使用数据库连接池
(2)优势是提高查询的效率
(3)劣势是在高并发的情况下,会导致连接数不够用
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化数据库连接");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("打开数据库连接Connection");
chain.doFilter(request,response);
System.out.println("关闭数据库连接");
}
/**
Test1Filter-init
TestFilter-init
Servlet-init
Test1Filter打开数据库连接Connection
TestFilter打开数据库连接Connection
Servlet-service
TestFilter关闭数据库连接
Test1Filter关闭数据库连接
*/
04监听器(listener)
Servlet当中的三大域
Application
(1)1对多的监听,彻底和代码解耦
(2)Application
①监听作用域本身
1)容器加载的时候调用application监听的contextInitialized方法
2)容器在关闭的时候,同时调用contextDestroyed方法
3)可以在监听当中获取application
②监听作用域的元素
1)可以监听到作用域当中所有的元素的增减和修改
2)监听到的修改的元素的值是 % 旧值%
旧值
ServletContext app = req.getServletContext();
String att = req.getParameter("att");
String key = req.getParameter("key");
String value = req.getParameter("value");
if("1".equals(att)) {
app.setAttribute(key, value);
}else if("2".equals(att)) {
app.removeAttribute(key);
}else if("3".equals(att)) {
app.setAttribute(key, value);
}
Session
①监听作用域本身
1)session的创建是第一次获取session后,sessionCreated监听执行
2)销毁
a.容器关闭
b.手动销毁
c.时间到期
Session监听绑定
实现在线用户统计的步骤
创建类实现HttpSessionBindingListener接口
在valueBound()和valueUnbound()方法中实现用户数量的统计
valueBound(HttpSessionBindingEvent arg0) {
//用户对象存入session时自动调用
//用户数量加1
}
valueUnbound(HttpSessionBindingEvent arg0) {
//用户对象从session中删除时自动调用
//用户数量减1
}
HttpSessionListener、HttpSessionBindingListener二者的区别
HttpSessionListener只需要设置到web.xml就可以监听整个应用中的所有session
HttpSessionBindingListener必须实例化后放入某一个session中,才能监听
监听范围
HttpSessionListener设置一次就可以监听所有session
HttpSessionBindingListener通常是一对一