博文
Action - 高级(2007-03-13 09:53:00)
摘要:Action类有以下七种:
org.apache.struts.action.Action
常规Action。
1. org.apache.struts.actions.ForwardAction
因为所有请求都需要经过控制器,所以直接链接到JSP将违反MVC原理。通过ForwardAction将请求链接到JSP页面。
在struts-config.xml中创建一个请求映射,并指定将转到的位置。
struts-config.xml:
<action-mappings >
<action forward="/action/for.jsp" path="/for" />
</action-mappings>
org.apache.struts.actions.IncludeAction
功能与ForwardAction功能相似,但不是转到指定页面,而是包含指定页面。
struts-config.xml:
<action-mappings >
<action include="/action/in.jsp" path="/in" />
</action-mappings>
org.apache.struts.actions.DispatchAction
能将一系列相关功能模块化到一个操作中。无须为每个操作创建单独的action。
如:无须创建类AddUserAction、UpdateUserAction、RemoveUserAction,可以通过扩展DispatchAction,创建具有以下方法的UserAction类:add()、update()、remove()。
运行时,DispatchAction根据请求参数决定调用哪个方法,请求参数名在struts-cofig.xml中定义:
struts-config.xml:
<action-mappings >
<......
Action - 初级(2007-03-13 09:51:00)
摘要:Action负责将视图层的数据传输到模型层中的特定事务处理,然后将处理结果返回到视图层。
请勿将事务逻辑嵌入到操作中,因为违反MVC的原则。
控制器只创建一个Action类的实例,用这个实例处理所有请求。
不要将action 写的太复杂,可以将更多的业务逻辑放到一个独立的应用层中进行处理。
action主要的操作如下所示:
1. 验证用户当前的会话状态。进行权限检查。
2. 如果form bean 的validate()验证没有完成,则继续完成验证。
如果form bean的validate()验证没有通过,则将错误信息保存在request域里,并调到相关的JSP资源。
3. 完成请求需要执行的业务逻辑。
4. 更新作用于下个页面的服务器端对象。
5. 返回一个ActionForward,跳转的视图层或进行下一步处理。
......
乱码问题(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......