`
windyer39
  • 浏览: 10537 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Head First Servlet & JSP

 
阅读更多

《Head First Servlet & JSP》笔记之web.xml

一、简单的servlet配置

<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>xxx.xxx.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

分为两部分,

1. <servlet></servlet>指定处理请求的servlet的name,class

2. <servlet-mapping></servlet-mapping>指定此servlet接收请求的路径

对于部署在tomcat容器里的应用,可以配置tomcat的server.xml,有两种方式:

1. <Context path=”" do
cBase=”D:\\work\\eclipse\\workspace\\HelloServlet\\WebRoot” />

访问路径是:http://localhost:8080/hello

2. <Context path=”helloservlet” docBase=”D:\\work\\eclipse\\workspace\\HelloServlet\\WebRoot” />

访问路径是:http://localhost:8080/helloservlet/hello

要注意的是,最后一个“/”后的字符串必须和servlet-mapping里的url-pattern对应。

web.xml里可以有多个servlet配置,用于处理不同的请求。

二、servlet初始化参数和整个应用公用的参数配置

1. servlet初始化参数配置

由于某些原因需要在servlet初始化的时候传入一些参数,以免硬编码,如:

<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>xxx.xxx.HelloServlet</servlet-class>
<init-param>
<param-name>email</param-name>
<param-value>xxx@163.com</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

上面的<init-param></init-param>用来配置servlet初始化参数,可以有多个,后台获取这些参数的代码:

getInitParameter(“email”);或者getServletConfig().getInitParameter(“email”);

原理:

每一个servlet都对应一个ServletConfig实例,在容器建立此servlet时,会读取web.xml里关于此servlet的配置,并将所有的<init-param></init-param>创建名/值对放在ServletConfig实例中,当servlet处理请求时,就可以得到servletConfig实例中的初始化参数了。

注:容器只在servlet初始化时读这些参数,如果以后更改了,需要重新部署此servlet。

2. 整个应用公用的参数配置,又叫上下文初始化参数

相当于公共常量,应用中的每个servlet都可能用到,示例:

<context-param>
<param-name>adminemail</param-name>
<param-value>xxxx@126.com</param-value>
</context-param>
<context-param>
<param-name>breed</param-name>
<param-value>chinese</param-value>
</context-param>

 

(1) 和servlet初始化参数不一样的地方是,servlet初始化参数放在<servlet></servlet>中,而上下文 参数是和<servlet></servlet>平级的,均放在<web-app></web- app>中。

(2) 后台获取这些参数的代码:

getServletContext().getInitParameter(“adminemail”);

原理和servlet初始化参数类似。

(3) 这种配置只能设定字符串,而对于希望参数是一个数据库DataSource这种对象的设定,上下文参数是无能为力的,有个办法是实现 ServletContextListener接口,上下文参数依然是字符串,但是在listener里根据这些参数构造一个对象出来,然后放在 ServletContext里,这样每个servlet就可以共用这个对象了。

配置:

<listener>
<listener-class>net.flymouse.listener.MyServletContextListener</listener-class>
</listener>

ServletContextListener接口就2个方法:

public void contextDestroyed(ServletContextEvent event) {
}
public void contextInitialized(ServletContextEvent event) {
}

分别是应用起来是做一些事情,在应用关闭时做一些事情,实例:

public class MyServletContextListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent event) {
    }

    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        String dogBreed = context.getInitParameter("breed");
        Dog dog = new Dog();
        dog.setBreed(dogBreed);

        context.setAttribute("dog", dog);
    }
}



《Head First Servlet & JSP》笔记之servlet的一生

一、加载和初始化 init()

容器根据web.xml寻找对应的servlet配置,根据请求的不同,加载不同的servlet类,然后调用servlet的init方法,完成初始化,在servlet没有完全初始化之前绝不能运行servlet的service()方法。

可以重载init方法从而读取servlet初始化参数,在servlet可以处理请求前做一些必要的事情。init方法只会在加载servlet时运行一次。

二、处理请求 service()

当请求到来时,容器开启一个新的线程,调用已经初始化后的servlet的service方法,此方法有两个参数:HttpRequest,HttpResponse,前者用于获取请求的参数,后者用于返回响应的数据。service方法根据get/post等http方法分别调用doGet/doPost方法,一般不重载service方法,而是重载doGet/doPost方法来处理客户端的请求。

注:get 和post区别

(1)get方法把参数放在url的后面,用&符号分割,第一个符号是问号,如:

http://xxxxx/hello?name=robbin&age=22,会向servlet传递两个参数,name和age,值分别是robbin和22.

缺点:参数长度有限制,对于过多的参数不能传递,而且参数暴露出来,安全性有问题。参见p111。

三、销毁 destroy()

和init一样,只会调一次,做一些和init相反的事情的时候可以重载这个方法。

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics