javaEE-Tomcat

01Web 应用服务器:

Tomcat、Jboss、webloic、Jetty

J2EE

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>用户名:&nbsp;</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通常是一对一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值