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