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>
程序 = 数据结构(构成元素)+算法(运行机理)
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一般用不到,是另外几种跳转方式时传递参数用的。
在jsp页面中获取值栈
<% 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
设计模式
ThreadLocal模式
与synchronized不同:synchronized是不同线程之间的数据共享,threadlocal是同一线程之间的不同时刻的数据共享(web中不同层次,表示层/业务逻辑层/持久层) 与对象传递不同:虽然通过自定义对象也可以达到同样目的,但是需创建对象 步骤: 1、建立一个类,并在其中封装一个静态的threadlocal变量,使其成为一个数据共享环境。 2、在类中实现访问静态threadlocal变量的静态方法;public class Counter { // 1 private static ThreadLocalcounterContext = new ThreadLocal () { 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、适合默认目标实现未知或者不易扩展的情况策略模式:(示例:有无折扣计算总价)
构造者模式:
适用于构建对象的构造过程十分复杂、构建对象的初始化对于其内部的对象有着强烈的逻辑依赖。
责任链模式:
击鼓传花
OGNL
Struts当接收到一个请求之后就会创建ActionContext、valueStack、action,并将action放入valueStack中
OGNL: struts2中用来取值,要配合struts标签使用 EL: jsp中使用的,可以读取struts中valueStack(值栈)中的值
在jsp中可以通过 ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack"); 获得,vs.findString(" ")获取值;