- Java EE 程序设计
- 郝玉龙编著
- 1099字
- 2025-02-21 11:23:45
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都不处理的访问请求。