Action访问URL
在struts.xml中配置的action,访问路径是http://ip:port/工程名/.../action名
package节点的名称对url没有影响,只有namespace在存在同名action的情况下会有影响。因为struts寻找action的方式是首先按照action的url中,action名称之前的当做命名空间的名称来查找,如果没有就在默认命名空间中查找。所以,如果不存在相同的action时,随时都可以只写action的名称进行访问!
执行路线
配置文件
修改配置文件位置
在web.xml中配置
<!-- structs2配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>resources/config/struts.xml</param-value>//当前相对位置是 classes
</init-param>
</filter>
<!-- structs2配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>resources/config/struts.xml</param-value>//当前相对位置是 classes
</init-param>
</filter>
程序 = 数据结构(构成元素)+算法(运行机理)
struts-default.xml 和 default.properties 是框架级的配置文件。
struts.xml 和 struts.properties 是应用级别的配置。它们的结构与框架级别的配置文件完全相同,但是其中定义的所有内容将覆盖框架级别的配置定义。
struts 框架中的xml文件的配置元素定义是properties文件的配置元素的超集。==凡是能够在properties中定义的配置元素都可以在xml中找到对应的配置方式(constant)来代替,反之则不成立。
struts2 中xml配置文件中bean(与spring中一样,管理bean)节点和constant节点用于指定运行时的参数,被称为容器配置元素。
package节点被称为 事件映射关系。
配置参考:
<action name="syslogo" class="com.newland.bi.webservice.frame.childsys.LogoAction">
<!--配置fi1eUpload的拦截器-->
<interceptor-ref name="fileUpload">
<!--配置允许上传的文件类型-->
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<!--配置允许上传的文件大小(K)-->
<param name="maximumSize">2</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<param name="root_path">upload/sys/logo</param>
<result name="success">upload_logo.jsp</result>
<result name="input">upload_logo.jsp</result>
<result name="fail">upload_logo.jsp</result>
</action>
配置说明:
result外部的param可以对action中的属性赋值的,这是ioc注入。--LogoAction中的root_path 将被注入
result内部的param一般用不到,是另外几种跳转方式时传递参数用的。
<!--配置fi1eUpload的拦截器-->
<interceptor-ref name="fileUpload">
<!--配置允许上传的文件类型-->
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<!--配置允许上传的文件大小(K)-->
<param name="maximumSize">2</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<param name="root_path">upload/sys/logo</param>
<result name="success">upload_logo.jsp</result>
<result name="input">upload_logo.jsp</result>
<result name="fail">upload_logo.jsp</result>
</action>
配置说明:
result外部的param可以对action中的属性赋值的,这是ioc注入。--LogoAction中的root_path 将被注入
result内部的param一般用不到,是另外几种跳转方式时传递参数用的。
在jsp页面中获取值栈
<%
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
String ma = vs.findString("aa");
值栈中有action,通过调试可以看到
%>
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
String ma = vs.findString("aa");
值栈中有action,通过调试可以看到
%>
打印struts的日志
在log4j的配置文件中添加:
log4j.logger.org.apache.struts2=DEBUG
log4j.logger.com.opensymphony.xwork2=DEBUG
log4j.logger.com.opensymphony.xwork2=DEBUG
设计模式
ThreadLocal模式
与synchronized不同:synchronized是不同线程之间的数据共享,threadlocal是同一线程之间的不同时刻的数据共享(web中不同层次,表示层/业务逻辑层/持久层)与对象传递不同:虽然通过自定义对象也可以达到同样目的,但是需创建对象
步骤:
1、建立一个类,并在其中封装一个静态的threadlocal变量,使其成为一个数据共享环境。
2、在类中实现访问静态threadlocal变量的静态方法;
public class Counter {
// 1
private static ThreadLocal<Integer> counterContext = new ThreadLocal<Integer>() {
protected synchronized Integer initialValue() {
return 10;
}
};
public static Integer get() {
return counterContext.get();
}
public static void set(Integer value) {
counterContext.set(value);
}
// 自定义封装业务逻辑
public static Integer getNextCount() {
counterContext.set(counterContext.get() + 1);
return counterContext.get();
}
}
装饰模式:
装饰模式可以通过继承来实现,不过比继承有更灵活的应用场景:、1、适合对默认目标实现中的多个接口进行排列组合调度
2、适合对默认目标实现进行选择性扩展
3、适合默认目标实现未知或者不易扩展的情况
![](https://img-my.csdn.net/uploads/201212/23/1356268682_8637.jpg)
策略模式:(示例:有无折扣计算总价)
![](https://img-my.csdn.net/uploads/201212/23/1356268701_5883.png)
构造者模式:
适用于构建对象的构造过程十分复杂、构建对象的初始化对于其内部的对象有着强烈的逻辑依赖。
责任链模式:
击鼓传花
OGNL
Struts当接收到一个请求之后就会创建ActionContext、valueStack、action,并将action放入valueStack中
OGNL: struts2中用来取值,要配合struts标签使用
EL: jsp中使用的,可以读取struts中valueStack(值栈)中的值
EL: jsp中使用的,可以读取struts中valueStack(值栈)中的值
在jsp中可以通过 ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack"); 获得,vs.findString(" ")获取值;