Servlet

//////////2017-2-6 ~ 2017-2-10///////////

int study_data(){

tomcat

tomcat

tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,也是apache基金会下面的一个核心产品,准确来说,是servlet 

jboss

jboss是一个基于J2EE的开放源代码的应用服务器。一般jboss总是绑定tomcat。jboss的核心是提供J2EE。

weblogic

美国Oracle公司出品的一个application server,确切的说是一个JAVAEE架构的中间件

IIS

这是一个微软的产品,支持一半静态的文件访问。支持CGI,支持asp aspx等等

tomcat安装

配置好java的环境,下载好tomcat,进入bin目录,然后运行启动命令startup.bat,要关闭时输入shutdown.bat

目录结构

/bin          :存放windows或Linux平台上启动和关闭tomcat的脚本文件
/conf        :存放tomcat服务器的各种全局配置文件
/lib           :存放所需的所有jar文件
/logs        :存放tomcat执行时的日志文件
/temp      :存放tomcat运行时产生的临时文件
/webapps:tomcat的只要web发布,默认情况下把Web应用文件放于此目录
/work       :tomcat将JSP生成的Servlet源文件和字节码文件放到这

WAR(Web Archive File)

网络应用程序文件,是最小的可部署单元

war有2种存在形式:
1.展开类型。就是一个目录,里面放了各种需要的文件。
2.打包类型。就是把上面的目录打包成war类型。

Servlet

是sun公司提供的一门用于开发动态web资源的技术,或者说实现动态网站的解决方案,一个Servlet就是java编程语言中的一个类

Servlet规范

定义了Servlet容器需要做什么,开发人员需要做什么开发工作,这样开发出来的war包部署到Servlet容器里,就能按照预期的逻辑运行。

Servlet请求过程

Servlet会根据请求的URL去决定该怎么做
http://hostname:port/contextRoot/xxxxxxxxx
contextRoot一般情况下就是war包的文件名,或者展开之后的目录名。除非特殊指定contextRoot。如果没有对应的web app就回去root下面去找,还没有就会报404错误。
找到了对应的web app之后,就会根据web app里面的规则(WEB-INF外面的文件或开发人员开发的Servlet),我们的Servlet容器就会new一个Servlet,然后执行它的init方法。
每次请求时调用service方法
每次关闭时调用destroy方法
关闭:
1.重新部署war包
2.停止web app
3.关闭整个容器

web.xml

servlet               :节点,表明下面是一个servlet的配置,挂在根节点下面
servlet-name     :给这个servlet指定一个唯一的名字。
servlet-class      :这个是这个servlet的实现类,可以使自己写的,也可以是jar包里的wevlet
init-param          :可以给servlet指定一些参数
load-on-startup :默认情况下实在第一次访问时才初始化Servlet。如果用了这个配置,就会在应用部署的时候就初始化该Servlet。配置的数字越小越先启动。
servlet-mapping:servlet地址映射节点。挂在根节点下面。
servlet-name     :就是在之前servlet节点中指定的名字。
url-pattern          :url匹配字符串,有几种方式
1.精确匹配。从/contextRoot开始,精确匹配url
2.目录匹配 。/开头,*结尾,如/*。
3.扩展名匹配。*.do , *.action
根目录匹配。就是一个/,来指明默认的servlet是什么

GenericServlet接口方法:

void init(ServletConfig config)                                         : 初始化操作
ServletConfig getServletConfig()                                    : 获取一个config对象
String getServletInfo()                                                     : 自定义servlet版本等信息
void service(ServletRequest req,ServletResponse res) : 请求响应
void destroy()                                                                  : 关闭时运行

HttpServlet接口

继承自GenericServlet,除了继承的方法外还有方法:
doDelete(HttpServletRequest req,HttpServletRequest resp)
doGet(HttpServletRequest req,HttpServletRequest resp)
doPut(HttpServletRequest req,HttpServletRequest resp)
doHead(HttpServletRequest req,HttpServletRequest resp)
doOptions(HttpServletRequest req,HttpServletRequest resp)
doPost(HttpServletRequest req,HttpServletRequest resp)
doTrace(HttpServletRequest req,HttpServletRequest resp)
完全对应于HTTP METHOD

Servlet注解

以前的开发模式,Servlet写完,一定要配置web.xml,设置servlet和它的mapping,最新的web.xml引入了注解。通过注解的方式直接把相关的配置写在了Servlet类的代码里

常用注解项:
@WebServlet(description=“some description”,
displayName="some display name",
loadOnStartup=1,
name="a name",
urlPatterns={"pattern1","pattern2"},
initParams={
@WebInitParam(name="wip1",value="v1"),
@WebInitParam(name="wip2",value="v2")
})

线程安全

Servlet是单实例的,它的Service或者doXXX方法被web容器用多线程的方式分享调用,要注意线程安全。

Session

Http请求是无状态的,要想实现如购物车功能的系统就可以借助session的功能。
session是把需要保留的信息保存在服务器端,然后给客户端发一个凭证。当客户端再次发起请求时,把凭证一起发送过来即可。就好像钥匙一样,就能继续读写保存在服务器端的数据。而且每个凭证都是相互独立的。

session数据存储位置
session的数据都放在服务器,每个容器都支持不同的存放机制。
1.单个文件
2.数据库
3.内存
4.其他
这容易导致session数量庞大或单个session数据量太大,解决方法:
1.调用invalidate()方法
invalidate()方法用来删除无用的session,可以减少session数量多的问题。
好处:一旦调用,session会立即删除。
坏处:需要用户配合去点击才能生效
2.session的timeout超时机制
也就是设定了一个时间,如果在时间内没有任何访问,这个session将自动被删除

Cookie

cookie是一小段保存在浏览器这端的数据。浏览器可以根据http协议来取出来发送给服务器,服务器也可以根据http协议来发送cookie给浏览器

cookie的产生:
1.在servlet运行过程中,可以通过HttpServletResponse.addCookie来添加cookie,并返回给浏览器
2.在浏览器端,我们的javascript也可以添加cookie

session与cookie的区别
1.存储地点不同,session是在服务器端,cookie是保存在浏览器端
2.session可以保存任何java对象,只要是可以序列化的,而cookie只能保存字符串
3.session的实现是需要cookie的。因为jsessionid是通过cookie来保存的。 有时候浏览器会禁止cookie。这个时候,要么没有session功能,要么把jsessionid放在url里

Filter

过滤器(拦截器),在处理请求时,可能需要一些预处理,Filter提供了类似工具类的作用,对servlet进行预处理或后处理。filter是在服务器启动时就实例化并初始化的

执行顺序
预处理从上往下,匹配一个执行一个,代码执行至doFilter(request,response);方法时进行下一个处理,所有预处理结束后执行servlet,后开始进行后处理,从下往上,开始执行doFilter(request,response);后面的代码。

Listener

监听器,作用在容器中,某些特定的事件发生时,可以激发我们的代码做一些事情。

你可能感兴趣的:(Servlet)