您的位置:首页 > 移动开发 > Android开发

【黑马Android】(18)Servlet/ServletConfig/ServletContext

2016-07-18 22:17 459 查看

Servlet快速入门

1.sun公司提供的动态web资源开发技术。本质是上一段java小程序,要求这个小程序必须实现Servlet接口,以便服务器能够调用。

2.开发Servlet的两个步骤

*实验:Servlet的快速入门

(1)步骤一:写一个java程序实现Servlet接口(此处直接继承了默认实现类GenericServlet)

package cn.itheima;

import java.io.*;

import javax.servlet.*;

public class FirstServlet extends GenericServlet{

public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{

res.getOutputStream().write("My FirstServlet!".getBytes());

}

}

(2)将编译好的带包的.class放到WEB-INF/classes下以外,还要配置web应用的web.xml注册Servlet

<servlet>

<servlet-name>FirstServlet</servlet-name>

<servlet-class>cn.itheima.FirstServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>FirstServlet</servlet-name>

<url-pattern>/FirstServlet</url-pattern>

</servlet-mapping>

3.利用MyEclipse开发Servlet

设置环境变量



指定包



Servlet的调用过程_Servlet的生命周期



Servlet的继承结构_修改Servlet模版

Servlet的继承结构

Servlet接口 --定义了Servlet应该具有的基本方法

|

|--GenericServlet --通用基本Servlet实现,对于不常用的方法在这个实现类中进行了基本的实现,对于Service设计为了抽象方法,需要子类去实现

|

|--HttpServlet --在通用Servlet的基础上基于HTTP协议进行了进一步的强化:实现了GenericServlet中的Service方法,判断当前的请求方式,调用对应到doXXX方法,这样一来我们开发Servlet的过程中只需继承HttpServlet
,覆盖具体要处理的doXXX方法就可以根据不同的请求方式实现不同的处理.一般不要覆盖父类中的Service方法只要覆盖doGet/doPost就可以了

Servlet细节问题

(1)一个<servlet>可以对应多个<serlvet-mapping>,从而一个Servlet可以有多个路径来访问

(2)url-partten中的路径可以使用*匹配符号进行配置,但是要注意,只能是/开头/*结尾或*.后缀这两种方式

~由于*的引入,有可能一个路径被多个urlpartten匹配,这是优先级判断条件如下:

哪个最像找哪个

*.后缀永远匹配级最低

(3)<serlvet>可以配置<load-on-startup>可以用来指定启动顺序

(4)缺省Servlet:如果有一个Servlet的url-partten被配置为了一根正斜杠,这个Servlet就变成了缺省Serlvet.其他Servlet都不处理的请求,由缺省Servlet来处理.

其实对于静态资源的访问就是由缺省Servlet来执行

设置404页面500页面等提示页面也是由缺省Servlet来执行

通常我们不会自己去配置缺省Servlet

(5)线程安全问题

由于默认情况下Servlet在内存中只有一个对象,当多个浏览器并发访问Servlet时就有可能产生线程安全问题

解决方案:

加锁--效率降低

SingleThreadModel接口 --不能真的防止线程安全问题

最终解决方案:在Servlet中尽量少用类变量,如果一定要用类变量则用锁来防止线程安全问题,但是要注意锁住内容应该是造成线程安全问题的核心代码,尽量的少锁主内容,减少等待时间提高servlet的响应速度

ServletConfig

ServletConfig -- 代表当前Servlet在web.xml中的配置信息

String getServletName() -- 获取当前Servlet在web.xml中配置的名字

String getInitParameter(String name) --
获取当前Servlet指定名称的初始化参数的值

Enumeration getInitParameterNames() --
获取当前Servlet所有初始化参数的名字组成的枚举

ServletContext getServletContext() -- 获取代表当前web应用的ServletContext对象

ServletContext

1.代表当前web应用的对象。

2.作为域对象使用,在不同servlet之间传递数据,作用范围是整个web应用

生命周期:当web应用被加载进容器时创建代表整个web应用的ServletContext对象。当服务器关闭或web应用被移除出容器时,ServletContext对象跟着销毁。

~域:一个域就理解为一个框,这里面可以放置数据,一个域既然称作域,他就有一个可以被看见的范围,这个范围内都可以对这个域中的数据进行操作,那这样的对象就叫做域对象。

3.在web.xml可以配置整个web应用的初始化参数,利用ServletContext去获得

<context-param>

<param-name>param1</param-name>

<param-value>pvalue1</param-value>

</context-param>

this.getServletContext().getInitParameter("param1")

this.getServletContext().getInitParameterNames()

4.在不同servlet之间进行转发

this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request, response);

方法执行结束,service就会返回到服务器,再有服务器去调用目标servlet,其中request会重新创建,并将之前的request的数据拷贝进去。

5.读取资源文件

5.1由于相对路径默认相对的是java虚拟机启动的目录,所以我们直接写相对路径将会是相对于tomcat/bin目录,所以是拿不到资源的。如果写成绝对路径,当项目发布到其他环境时,绝对路径就错了。

5.2为了解决这个问题ServletContext提供了this.getServletContext().getRealPath("/1.properties"),给进一个资源的虚拟路径,将会返回该资源在当前环境下的真实路径。this.getServletContext().getResourceAsStream("/1.properties"),给一个资源的虚拟路径返回到该资源真实路径的流。

5.3当在非servlet下获取资源文件时,就没有ServletContext对象用了,此时只能用类加载器

classLoader.getResourceAsStream("../../1.properties"),此方法利用类加载器直接将资源加载到内存中,有更新延迟的问题,以及如果文件太大,占用内存过大。

classLoader.getResource("../1.properties").getPath(),直接返回资源的真实路径,没有更新延迟的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: