5. web.xml 配置
5.1. 基本配置
web.xml 采用 servlet2.4 规范,默认配置了会话过期时间和网站首页文件。
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 会话的时间 --> <session-config> <session-timeout>30</session-timeout> </session-config>
<!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
</web-app> |
5.2. 加载 spring 监听
在 web.xml 文件中加入如下配置:
<!-- 设置环境变量,将 web 应用根目录存储到环境变量中 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root</param-value> </context-param>
<!-- 设置环境变量指定 applicationContext.xml 配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext.xml /WEB-INF/applicationContext-admin.xml /WEB-INF/applicationContext-quartz.xml </param-value> </context-param>
<!-- 设置 context 的监听,启动时加载 applicationContext.xml 文件,初始化 applicationContext 实例 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> |
5.3. Log4j 日志
首先,在 web.xml 文件中加入如下配置:
<!-- 设置环境变量指定 log4j 的配置文件 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param>
<!-- 设置 log4j 的监听,使日志组件能够使用,调用 log4jConfigLocation 中设置的环境变量 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> |
log4j.properties 文件放在 /WEB-INF/ 目录下, 文件内容如下例,其中根日志级别为 warn ,而在包 cn.idtag 中的类的日志级别为 info 。
# 定义根日志的级别和输出路径 fatal, error, warn, info, debug log4j.rootCategory=warn, stdout, logfile
# 在包 cn.idtag 中的类的日志级别 log4j.logger.cn.idtag=info
# 日志输出参数 #%c: 日志信息所在类名 #%d: 日志信息产生时间 #%p: 日志信息级别 #%m: 产生的日志具体信息 #%n: 输出日志信息换行 log4j.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c%n%m%n%n
# 控制台输出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=${log4j.ConversionPattern}
# 日志文件输出 log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/log.txt log4j.appender.logfile.Append = true log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=${log4j.ConversionPattern} |
5.4. 解决中文乱码
在 web.xml 文件中加入如下配置,可以解决表单提交的编码,不需要在每个 *.jsp 、 *.htm 等页面上编写代码“ <%@ page contentType="text/html; charset=gbk" language="java"%> ”了,并且为浏览器端设置的“ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ”代码也不需要写了,浏览器会自动识别,注意建立文件时一定要使用 UTF-8 字符集。
<!-- 设置字符串过滤器,解决表单 Post 提交中的乱码问题 --> <filter> <filter-name>characterEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<!-- 设置 jsp,htm,html 页面的字符集,是否使用标签,是否使用 jsp 脚本等,头尾载入页面等 --> <jsp-config> <jsp-property-group> <description> 指定 JSP 文件的配置属性 </description> <display-name>jspConfiguration</display-name> <url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored> <page-encoding>utf-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group>
<jsp-property-group> <description> 指定 htm 文件的配置属性 </description> <display-name>jspConfiguration</display-name> <url-pattern>*.htm</url-pattern> <el-ignored>false</el-ignored> <page-encoding>utf-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group>
<jsp-property-group> <description> 指定 html 文件的配置属性 </description> <display-name>jspConfiguration</display-name> <url-pattern>*.html</url-pattern> <el-ignored>false</el-ignored> <page-encoding>utf-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group>
</jsp-config> |
如果应用服务器是 Tomcat ,编辑 Tomcat 根目录下的“ /conf/server.xml ”文件,找到 Connector 配置部分,在配置结尾加入“ URIEncoding="utf-8" ”:
<Connector port="8080" maxThreads="150" …… disableUploadTimeout="true"/> 改为: <Connector port="8080" maxThreads="150" …… disableUploadTimeout="true" URIEncoding="UTF-8"/> |
可解决系统内部 GET 方法传递中文字符参数的乱码问题,但是在外部 URL 请求中参数值带有中文的,必须使用 URLEncode 编码。
5.5. 配置 servlet
在 web.xml 文件中配置 servlet 请求路径和实现类:
<servlet> <servlet-name>sendSms</servlet-name> <servlet-class>cn.idtag.test.servlet.SendSmsServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>sendSms</servlet-name> <url-pattern>/servlet/sendsms</url-pattern> </servlet-mapping> |
而 SendSmsServlet.java 文件需要继承 HttpServlet 类,如果 response 要输出内容并包含非英文字符,要设置输出的字符集为 UTF-8 :
package cn.idtag.test.servlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.ServletException; import java.io.IOException;
public class SendSmsServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "utf-8")); try { //do something… } finally { out.close(); } }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |