servlet 总结

1、web原理与规范____________________________________________________________

只要实现http规范,自己也可以

CGI (Common Gateway Interface) 通用网关接口

       CGI可以用任何一种语言编写,通过socket接受处理数据,是单线程的。

servlet是多线程的,servlet规范声明其不是线程安全的。如果声明为单线程,容器会维护多个实例。

servlet其实是个socket,只要实现http规范,自己也可以.

2、servlet____________________________________________________________

一、配置文件:

只需要web.xml一个配置文件。

二、原理:

serverSocket接受到socket.getInputStream,解析string,生成request,匹配web.xml配置选择需要的servlet或者filter,listener,进行业务处理,根据socket.getOutputStream生成response。返回给浏览器。

session原理

       http是无状态的协议,服务器不会自动维护客户的上下文信息,

       session保存上下文信息,针对每一个用户,保存在服务器,通过SessionID来区分不同的客户

       session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,

       wireshark拦截的Cookie: JSESSIONID=C69B3053C575ECC8C7FCAF7D189A4FD1

       session cookie存储于浏览器内存中,不能跨窗口使用,即JSESSIONID,

       浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串。

       persistent cookie存储在硬盘            

ServletContext接口没有实现类。

       ServletContext对象生命周期是Application,只在web应用被关闭的时候才被销毁。

       定义了一系列方法用于与相应的servlet容器通信,比如:获得文件的MIME类型,分派请求,或者是向日志文件写日志等。 

       每一个web-app只能有一个ServletContext,web-app可以是一个放置有web   application   文件的文件夹,也可以是一个.war的文件。 

       ServletContext对象包含在ServletConfig对象之中,ServletConfig对象在servlet初始化时提供servlet对象。 

ServletConfig接口有实现类

servlet有三大类:

一、标准servlet 继承HttpServlet extends GenericServlet  implements ServletConfig

二、监听器-常用的监听接口-------单用户登录器extends HttpSessionListener

       ServletContextListener

       ServletContextAttributeListener

       HttpSessionListener

               sessionCreated,sessionDestroyed

       HttpSessionAttributeListener

               attributeAdded,        attributeRemoved,attributeReplaced

三、filter--责任链

org.apache.struts2.dispatcher.FilterDispatcher implements StrutsStatics, Filter

public class CharacterEncodingFilter implements Filter {

 

三、web.xml 中 servlet, spring, filter, listenr的加载顺序

       listener >> filter >> servlet >> spring

四,web.xml中的url-pattern匹配

       1.     精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。

       2.     最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此 时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

       3.     扩展(通配符)匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

       4.     如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet。

       1、以”/’开头和以”/*”结尾的是用来做路径映射的。

       2、以前缀”*.”开头的是用来做扩展映射的。

       3、“/” 是用来定义default servlet映射的。

       4、 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

       所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

3、struts与serlvet____________________________________________________________

struts2的void方法serlvet方式的。

        HttpServletResponse response = ServletActionContext.getResponse();

        response.setContentType("text/json; charset=GBK");

        response.getWriter().print(this.getMessage());

struts流程:

1 客户端(浏览器socket)初始化一个指向Servlet容器(例如Tomcat)的请求

2 这个请求经过一系列的过滤器(Filter)(如ActionContextCleanUp)

3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6 ActionProxy创建一个ActionInvocation的实例。

7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果(可以是:jsp,另外的一个Action链)

struts源代码:

public class StrutsServlet extends HttpServlet 
public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
                ActionMapping mapping = prepare.findActionMapping(request, response, true);
                if (mapping == null) {
                        chain.doFilter(request, response);
                } else {
                        execute.executeAction(request, response, mapping);
                }
        }
}
 

猜你喜欢

转载自luckywnj.iteye.com/blog/1722414
今日推荐