Servlet的基本知识

Servlet定义

从字面上可以看到Servlet == server + Applet,本质上市一个Servlet就是一个java类,并听够基于请求-响应模式的Web服务。他是一个特殊的java类,没有main方法,其次他不能独立运行在JVM上,他需要在Web容器中装载运行,由容器管理其生成和销毁。
注意:
1.我们在编写Servlet的时候必须遵循Servlet规范。
2.Servlet和http是有一定关联的,servlet几乎可以处理所有的HTTP请求,并能够向客户端提供相应的HTTP响应。

Servlet容器

通俗点说,容器就是放置东西的地方,Servlet容器就是放置Servlet的地方,Servlet容器除了装载Servlet还需要管理Servlet,包括Servlet的创建、执行、销毁。

装载和管理Servlet:

Servlet容器实际上就是服务端程序,这个程序负责把请求转发给Servlet,交由Servlet处理,当Servlet处理完之后由Servlet容器将结果返回给客户端。

Servlet的工作原理:

(1)Servlet需要在Servlet容器中运行;
(2)Servlet根据部署描述符配置的Servlet映射关系找到对应的Servlet;
(3)Servlet根据请求的类型(HTTP类型)将请求转到对应的Servlet方法;
(4)Servlet将客户端请求封装到HttpServletRequest;Servlet将响应通过HttpServletResponse发回到客户端。

Servlet处理流程:


(1)首先我们在浏览器中输入了URL地址;
(2)Servlet容器根据URL地址通过配置文件web.xml找到对应的Servlet;
(3)同时将请求转发给Servlet的service(),Service()是Servlet的一个核心,每当一个客户端请求一个HTTPServlet对象的时候,该对象的Service()就会被调用,而且会给该方法传递一个HttpServletRequst对象和HttpServletResponse对象作为参数由于我们使用的是Http get方法访问Servlet,这样service()就会把相应的请求转发给doGet()处理;
(4)最后我们是用过doGet()里通过HttpServletResponse对象将信息返回给客户端。

Servlet生命周期:

(1) 初始化——请求处理——销毁
(2) 初始化对应init方法,当外部有一个请求的时候,servlet会通过调用init方法,创建对应的对象实例
(3) 请求处理,对应service方法,根据http请求类型,将不同的http请求转发给不同的方法进行处理,例如doGet|doPost方法等
(4) 销毁对应destroy方法。资源的回收与清理。
(5) Init方法,只会在整个servlet生命周期中调用一次。

 

Get方法与Post方法的区别:

(1) 传输方式:
Get是将需要传输的数据通过httpHeader进行传输,而post则通过httpbody进行传输
Get方法URL中需要显示出来,post方法则不需要。
Get方法因为受限于URL,因此数据大小一般为2K-8K,而post则没有什么限制
(2) 设计目的:
Get方法主要是从服务器端获取数据,之所以get方法也可以传输数据,是因为需要告诉服务器,get方法需要什么样的数据;
Post方法则是将数据发送给服务器
(3)  安全性:get低,post高

xml配置 Servlet例子

<servlet>
	<servlet-name>TestServlet</servlet-name>    
	<servlet-class>com.netease.server.example.web.controller.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>TestServlet</servlet-name>
	<url-pattern>/hello</url-pattern>       //映射到URL的Servlet名称
</servlet-mapping>

Servlet对象初始化参数设置:

在web.xml中配置后,可以通过ServletConfig对象读取servlet配置信息,不要将配置信息直接写在代码里。
Web.xml中可以通过<init-param></init-param>进行配置;

<servlet>
	<init-param>
		<param-name>data1</param-name>
		<param-value>value1</param-value>
	</init-param>
	<init-param>
		<param-name>data2</param-name>
		<param-value>value2</param-value>
	</init-param>
	<servlet-name>ServletConfigServlet</servlet-name>
	<servlet-class>com.netease.server.example.web.controller.ServletConfigServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ServletConfigServlet</servlet-name>
	<url-pattern>/servlet/ServletConfig</url-pattern>
</servlet-mapping>

在Servlet中可以通过通过getServletConfig()获得配置信息,再通过getInitParameter(ParaName)获得具体的配置

Servlet初始化过程中,<init-param>参数将被封装到ServletConfig对象中,每个servlet支持设置一个或者多个<init-param>参数,该配置以servelet为单位,并非全局共享。

 Servlet全局参数设置:

如果多个servlet需要共享同一个配置信息,可以使用servletContext。Servlet在启动的时候,会对每个web应用创建一个servletcontext对象,该servletContext对象在其对应的应用中,全局唯一,与应用一一对应。
ServletContext可以通过<context-param></context-param>进行配置,例子:

<!-- servletcontext servlet -->
<context-param>
	<param-name>globalData1</param-name>
	<param-value>123</param-value>
</context-param>
<context-param>
	<param-name>globalData2</param-name>
	<param-value>345</param-value>
</context-param>
<servlet>
	<servlet-name>ServletContextServlet</servlet-name>
	<servlet-class>com.netease.server.example.web.controller.ServletContextServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ServletContextServlet</servlet-name>
	<url-pattern>/servlet/ServletContext</url-pattern>
/servlet-mapping>

ServletContext对象的两个相关特性:

(1)通过配置文件共享全局配置信息;
(2)通过其context属性的set get实现不同的Servlet之间的通信。
(3)另外还可以读取外部的资源配置文件信息
(4)还可以做servlet转发

 ServletContext()读取外部资源:

通过ServletContext方法,读取外部资源配置文件信息:
(1)getResource,传入一个外部路径的地址,返回一个url的对象。
(2)getResourceAsStream,返回一个stream对象
(3)getRealPath,传入相对路径,返回绝对路径

 

webapp的应用程序结构:

(1)公共资源
诸如css js html images等
(2)META-INF目录
META-INF中定义了包扩展属性,类加载路径,定义一些自定义的属性
(3)WEN-INF目录
Web应用的核心和专用区,不提供给用户,用户也无法通过浏览器访问,放置类文件(classes目录下,编译的代码,编译的类),和类所依赖的jar包,第三方库(lib目录下)。另外还有wen.xml文件,被称作部署描述符。

 部署描述符:

(1)xml文件,且命名必须为web.xml
(2)用来设置wen应用程序的组件的部署信息
(3)Servlet容器需要支持部署描述符中的所有元素

 mapping元素的<url-pattern>匹配规则:

注意:servlet声明中,支持多个<url-pattern>对应转发给同一个servlet
Servelt支持用*这样的模糊匹配
ServletMapping匹配规则;
(1)精确路径匹配,完全匹配
(2)最长路径匹配,最长前缀匹配
(3)扩展名匹配
(4)default servlet或者放弃、报错

 
默认情况下,servlet是在第一次请求的时候才会被servlet容器所加载的。

启动加载Servlet设置:

如果需要在容器启动时,就要进行加载,则可以通过<load-on-startup>这个元素进行在设定,如果这个值>或者=0,就意味着容器在启动的时候就会加载这个servlet。如果这个值是负数或者没有设定,就是在第一次请求的时候才会加载。同样都是整数,设置为2比设置为3,启动的优先级高。

<servlet>
	<load-on-startup>1</load-on-startup>
	<servlet-name>TestServlet</servlet-name>
	<servlet-class>com.netease.server.example.web.controller.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>TestServlet</servlet-name>
	<url-pattern>/hello</url-pattern>
</servlet-mapping>

定义错误页面:

当访问一个URL不存在的页面的时候,会跳出默认的404页面,如果需要修改,就需要修改部署描述符中的自定义错误页面。
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
<error-page>
更高级的做法还有添加exception-type,捕获一个java异常类型
 

欢迎页面设置:

当用户在浏览器中输入的URL并不包括某个servlet的映射路径,就会根据<welcome-file-list>这个元素,显示指定的文件。一个<welcome-file-list>中可以包括多个<welcome-file> 

<welcome-file-list>
	<welcome-file>
	  /index.html
	</welcome-file>
</welcome-file-list>

MIME设置:

当输入一个公共资源的URL后,浏览器是去打开文件,还是去下载文件?
MIME类型映射。
<mime-mapping>元素定义了扩展文件名映射的类型
它包括两个字元素,<extension>定义了扩展名,<mime-type>不同扩展名的不同标准。

<mime-mapping>
	<extension>java</extension>
	<mime-type>text/plain</mime-type>
</mime-mapping>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值