首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

servlet 小结

2012-11-23 
servlet 总结1、web原理与规范____________________________________________________________?只要实现htt

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);                }        }}
?

?

?

?

?

?

热点排行