Java EE 程序设计
上QQ阅读APP看书,第一时间看更新

3.6 Servlet配置

3.6.1 初始化参数

Servlet除了从请求对象中获取信息以外,还可以从配置文件中获取配置参数信息。与请求中的动态信息不同,配置文件中的参数信息与具体的请求无关,而是Servlet初始化时调用的。通过配置信息来初始化Servlet可以有效避免硬编码,提高Servlet的可移植性。

Servlet配置参数保存在ServletConfig对象中。在Servlet被实例化后,ServletConfig对象对任何客户端在任何时候的访问都有效,但一个Servlet的ServletConfig对象不能被其他Servlet访问。

在Servlet中调用getServletConfig方法可直接获取ServletConfig对象。

在“项目”视图中选中Web应用程序Chapter3,右击,在弹出的快捷菜单中选择“新建”→Servlet命令,弹出New Servlet对话框。在“类名”文本框中输入Servlet名称InitParamServlet。在“包”文本框中输入Servlet类所在的java包名称com.servlet。单击“下一步”按钮,得到如图3-26所示的对话框。选中“将信息添加到部署描述符(web.xml)”复选框。

图3-26 配置Servlet的初始化参数

单击“新建”按钮,在“初始化参数”列表中将新增一项。在“名称”单元格中输入Servlet初始化参数名称FileType,在“值”单元格中输入初始化参数的值image。默认其他选项设置,单击“完成”按钮,NetBeans自动生成InitParamServlet的框架源文件。主要代码如程序3-20所示。

程序3-20:InitParamServlet.java

    package com.servlet;
    …
    public class InitParamServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse
    response)
              throws ServletException, IOException {
            response.setContentType("text/html; charset=UTF-8");
          PrintWriter out = response.getWriter();
          try {
              response.setContentType("text/html; charset=UTF-8");
              for (Part p : request.getParts()) {
                  String ftype=this.getInitParameter("FileType");
                  if (p.getContentType().contains(ftype)) {
                    String fname = getFileName(p);
                    p.write(fname);
                    System.out.println(fname);
                    System.out.println(p.getContentType());
                }
              }
          } catch (Exception e) {
              System.out.println(e.toString());
          } finally {
              out.close();
          }
      }
    private String getFileName(Part part) {
          String header = part.getHeader("Content-Disposition");
          String fileName = header.substring(header.indexOf("filename=\"") + 10,
          header.lastIndexOf("\""));
          fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
          return fileName;
      }
    …
    }

程序说明:首先需要注意的是,由于示例选择将在web.xml中保存配置信息,因此,代码中便没有了注解@WebServlet。程序中通过调用Servlet的getInitParameter方法可以方便地获得Servlet的初始化参数。若Servlet有多个初始化参数,则可调用getInitParameter获得代表初始化参数列表的枚举。

Servlet在web.xml中的配置信息如程序3-21所示。

程序3-21:web.xml(片段)

    <servlet>
          <servlet-name>InitParamServlet</servlet-name>
          <servlet-class>com.servlet.InitParamServlet</servlet-class>
          <init-param>
              <param-name>FileType</param-name>
              <param-value>image</param-value>
          </init-param>
        </servlet>
        <servlet-mapping>
          <servlet-name>InitParamServlet</servlet-name>
          <url-pattern>/InitParamServlet</url-pattern>
        </servlet-mapping>

修改程序3-11,将文件上传表单的action属性指向Servlet组件InitParamServlet,重新运行程序3-11,看看会得到什么结果。

说明:Servlet的初始化参数也可以通过注解@WebInitParam在Servlet实现代码中进行配置,但是将Servlet的初始化参数配置在部署描述文件中,如果在部署Servlet组件时需要调整初始化参数,可直接编辑部署描述文件,而不需要重新编译代码,从而大大提高了程序部署的灵活性。

3.6.2 URL模式

在Servlet配置中,除了初始化参数外,还有一个重要的工作便是配置Servlet对应的URL地址信息,又称为URL模式。这里之所以称之为URL模式而不是URL地址,是因为同一个Servlet可以被映射到多个URL地址上。

另外,在Servlet映射到URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。如下所示:

    <servlet-mapping>
        <servlet-name>First</servlet-name>
        <url-pattern>/First/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>First</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

3.6.3 默认Servlet

特别值得一提的是,如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的默认Servlet。

凡是在当前Web应用上下文找不到匹配的组件的URL,它们的访问请求都将交给默认Servlet处理,也就是说,默认Servlet负责处理所有其他Servlet都不处理的访问请求。