博文
乱码问题(2007-03-12 22:59:00)
摘要:一。URL:
修改%TOMCAT_HOME%\conf\server.xml文件
找到如下内容:
<Connector
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
添加:URIEncoding="utf-8"
修改后内容如下:
<Connector
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
&......
上传(2007-03-12 22:55:00)
摘要:struts中含有支持文件上传功能的包org.apache.struts.upload。可以创建一个包含FormFile类型的属性的ActionForm。如:
package cn.rolia.struts.upload;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
public class UploadForm extends ActionForm {
private FormFile theFile;
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return null;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
}
public FormFile getTheFile() {
return theFile;
}
public void setTheFile(FormFile theFile) {
......
日志 log4j(2007-03-12 22:55:00)
摘要:日志分两种:
1. 系统日志:处理应用程序内部操作而不是基于用户的特定操作。例如:SMTP主机没有响应。
2. 应用程序日志:特定用户操作中的记录。
日志作用
记录异常;
安全检查
非法用户跟踪
测试
日志种类
1. 容器日志文件。日志文件的名称和位置依赖与文件。可在类中直接从获取日志记录器。如:
javax.servlet.ServletContext context = getServlet().getServletContext();
context.log("日志");
2. 使用common-logging。具体不介绍。
3. 使用common-logging和log4j的结合。下面详细介绍如何使用log4j
使用log4j进行记录
配置步骤:
1. 下载log4j的 jar 文件
2. 将jar文件复制到应用程序的WEB-INF/lib目录里
3. 配置log4j.properties。举例如下:
log4j.rootLogger=WARN,Console,File
log4j.logger.cn.rolia.top.LoggingListener=INFO,Console,File
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p %c - %m%n
log4j.appender.File=org.apache.log4j.FileAppender
log......
模块间的切换(2007-03-12 22:54:00)
摘要:问题
想从一个模块(源模块)切换到另一个模块(目标模块)。
解决方案
在你的源模块中建立一个type为“org.apache.struts.actions.SwitchAction”的action:
<action path="/ChangeModuleTest"
type="org.apache.struts.actions.SwitchAction"/>
使用这个action,向它传递两个参数prefix和page。prefix指明了目标模块名称,必须是以斜扛开头(“/”),page指明了相对于目标模块的位置。如:
<html:link page="/ChangeModuleTest.do?prefix=moduleName&page=/SomeAction.do">
Change Module
</html:link>如果你要连接到一个action,别忘了加上”.do”。
讨论
SwitchAction能将应用程序从一个模块转到另一个模块,然后跳转到目标模块的指定位置。
同ForwardAction、IncludeAction一样SwitchAction不需要子类化。
当我们在浏览器中使用http://hostaddress/contextpath/module/action.do式样的的url时,actionservlet会根据module选择模块对象,下面是actionservlet处理http请求的代码:
protected void process(HttpServletRequest request,
HttpServletResponse response)
 ......
模块化(2007-03-12 22:53:00)
摘要:需求
需要将一个模块分割成多个子模块,每个模块有自己的配置文件。
解决方案
在web.xml中配置如下:
<!-- Action Servlet Configuration -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/module1</param-name>
<param-value>/WEB-INF/struts-config-module1.xml</param-value>
</init-param>
<init-param>
<param-name>config/module2</param-name>
<param-value>/WEB-INF/struts-config-module2.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
讨论
struts引入模......
使用多个struts-config配置文件(2007-03-12 22:52:00)
摘要: 可以将一个struts-config.xml分割成多个小的struts-config.xml。每个都必须按照struts-config DTD文件的格式进行编写。配置距举例如下:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml,
/WEB-INF/struts-config-2.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
当载入ActionServlet类时,struts将多个配置文件拼成单个的配置文件。
如果多个配置文件中有重复的元素则使用最后一个配置文件中的。
你也可以为多个字模块指定多个配置文件。如下所示:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-para......
全局常量(2007-03-12 22:52:00)
摘要:可以声明一个plug-in。在plug-in中声明常量并将其保存在ServletContext中
举例如下:
Constants.java:
package com.yourcompany.struts.constants;
import java.util.HashMap;
import java.util.Map;
public class Constants {
public Map globalConstants;
public Constants(){
globalConstants = new HashMap();
globalConstants.put("userName","Rolia");
globalConstants.put("path",new java.util.Date());
}
public Map getGlobalConstants() {
return globalConstants;
}
public void setGlobalConstants(Map globalConstants) {
this.globalConstants = globalConstants;
}
}
ConstantsPlugin.java:
package com.yourcompany.s......
tag library(2007-03-12 22:49:00)
摘要:可以在JSP中创建引用绝对路径的一个taglib,这样的话就不许要在WEB.XML中声明了。如:<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %><%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %><%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %><%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- start taglib -->
<%@ include file="/includes/taglibs.inc.jsp" %>
<!-- end taglib -->
<html:html>
<body>
...
当你用绝对URL指定taglib时,你不需要将相应的taglib中加入到web.xml中去。
Servlet2.3之前必须在web.xml中声明taglib 从2.3开始才可以使用绝URI。绝对URI是由相应的TLD文件确定的。
如果你想在整个应用程序中使用同一个talib库,可以创建一个包含taglib的文件,然后将此文件包含到任意的JSP页面中去。
struts1.1和struts1.2中的taglib是有区别的:
Tag......
ActionForward(2007-03-12 22:48:00)
摘要:使用forward可以定义URL的逻辑名称,然后使用逻辑名称来应用URL。这样,在更新URL时,不必更新URL的每个引用,只须在struts-config.xml中更改一次这个引用。
可以定义两类forward:全局forward和针对具体请求的forward。全局forward在整个应用程序中都可以使用,针对具体请求的forward只可以在他各自的请求action中使用。
全局forward的定义示例:
<forward
name="for"
path="/forward/for.jsp"
redirect="true"
contextRelative="true" />
针对具体请求的局部forward的定义通过在action标记中嵌套forward标记来定义:
<action-mappings >
<action path="/forac" type="com.yourcompany.struts.action.ForacAction">
<forward name="success" path="/for.jsp" />
</action>
</action-mappings>
......
Struts的控制层(2007-03-12 22:45:00)
摘要:
担任MVC/Model 2控制器角色核心的是ActionServlet.
ActionServlet必须在web.xml里进行配置。具体配置参数参见“web.xml参数设置.doc”
Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类,在上述情况下,Servlet容器都会在ActionServlet被加载后立即执行它的init()方法。具体的init()方法代码解读参见“ActionServlet的init()方法.doc”。
可以继承ActionServlet来定义自己的控制器,通常的目的是重新定义ActionServlet的init()方法,增加自己的初始化动作:
定义如下的类:
import sample;
public class ExtendedActionServlet extends ActionServlet {
public void init() throws ServletException {
super.init();
//加入自己的代码
……………
}
}
扩展完类后,还应该在web.xml文件中如下配置:
<servlet>
<servlet-name>sample</servlet-......