有关 Struts & Struts2

struts2和1的区别
struts:过去最流行的的Web MVC组件,apache项目组的一个开源项目。
struts2:现在非常流行的Web MVC组件,是Apache用Struts和Webwork组合出来的产品。

两者都是web MVC组件,利用这两个组件都可以比较方便地开发web项目。不过Struts毕竟是老组件,在人们开发过程中,发现了如下问题:
1.Struts支持的表现层技术太单一,就只有jsp。不支持freemaker、velocity等当前比较流行的页面技术。
2.Struts的Action与servletAPI过于耦合,难以测试。这一点对于初学者来说可能没什么感觉,只有你用它开发过大型项目才知道。企业开发过程中,我们既要写正式代码,也要写相应的测试代码(即单元测试类,以此来保证代码是符合我们预期的),如果正式代码和servlet API耦合太深,会造成你的测试类难以编写,一旦离开web服务器就会难以测试。
3.struts属于侵入式设计,在你的代码里,除了你自己的类之外,还会包含Struts的API。这样的设计毕竟用到别人的组件,少不了会用到别人的API。只是这样的设计会影响代码的重用,如果需要重构,就会比较麻烦。
以上就是Struts的主要缺点,作为大改之后的Struts2,对以上问题都做了改进:
1.Struts2支持多种表现层技术,如freemaker、velocity都支持。
2.Struts2中,Action不再与servlet API耦合(当然了,你希望在Action里使用servlet API也许),便于编写单元测试类。
3.Action不需要和Struts2耦合,方便重用。

Struts2框架的大致处理流程
1.浏览器发送请求,例如请求 mypage.action / report / myreport.pdf等。
2.核心控制器FilterDispatcher根据请求决定调用合适的Action。
3.WebWork的拦截器自动对请求应用通用功能,例如workflow, validation或文件下载和上传。
4.回调Action的execute方法(其实可以是任意方法),该方法execute方法先获得用户的请求参数,然后执行某种数据操作,调用业务逻辑组组件来处理用户请求。
5.Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面,pdf还有jsp,velocity,freemarker等技术模板。

struts.xml的配置
struts.xml的配置:

<struts>
<!--include节点是struts2中组件化的方式,可以将每个功能模块独立到一个xml配置文件中,然后用include节点引用-->
<include file="struts-default.xml"></include>
<!--package提供了将多个Action组织为一个模块的方式;package的名字必须是唯一的;package可以扩展,当一个package扩展自另一个package时该package会在本身配置的基础上加入扩展的package的配置;父package必须在子package前配置;
name:package名称 extends:继承的父package名称
abstract:设置package的属性为抽象的;抽象的package不能定义action值true:false
namespace:定义package命名空间;该命名空间影响到url的地址,例如此命名空间为/test那么访问时的地址为:
http://localhost:8080/struts2/test/XX.action-->
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
<interceptors>
<!-- 定义拦截器 name:拦截器名称;class:拦截器类路径 -->
<interceptor name="timer"
class="com.kay.timer"></interceptor>
<interceptor name="logger"
class="com.kay.logger"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器;每个Action都会自动引用;如果Action中引用了其他的拦截器,默认的拦截器将无效-->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 全局results配置 -->
<global-results><result name="input">error.jsp</result></global-results>
<!--Action配置 一个Action可以被多次映射(只要action配置中的name不同)
    name:action名称; class:对应的类的路径; method:调用Action中的方法名 -->
<action name="hello" class="com.kay.struts2.Action.LoginAction">
<!--引用拦截器 name:拦截器名称或拦截器栈名称 -->
<interceptor-ref name="timer"></interceptor-ref>
<!-- 节点配置 name:result名称和Action中返回的值相同;type:result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher -->
<result name="success" type="dispatcher">/talk.jsp</result>
<result name="error" type="dipatcher">/login.jsp</result>
<!-- 配置Action返回cancel时重定向到Welcome的Action -->
<result name="cancel" type="redirect-action">Welcome</result>
<!-- 异常处理 result表示出现异常时返回的name为success的结果处理 -->
<exception-mapping exception="java.lang.Exception" result="success"/>
<!-- 参数设置 name: 对应Action中的get/set方法 -->
<param name="url">http://www.sina.com</param>
</action>
</package>
<!-- 引用国际化文件的base名 -->
<constant name="struts2.custom.i18n.resources" value="messageResource">
</struts>

Struts2的action编写
例:HelloWorld.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
    <title>Hello World!</title>
    </head>
    <body>
    <h2><s:property value="message"/></h2>
    </body>
    </html>

例: classes/tutorial/HelloWorld.java

import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport{
private String message;
public String getMessage(){
return message;
}
public void string setMessage(String message){
this.message=message;
}
@Override
public String execute(){
message="Hello World, Now is"+ DateFormat.getInstance().format(new Date());
return success;
}
}

例: classes/struts.xml中HelloWorld Action的配置

<package name = "ActionDemo" extends="struts-default">
<action name="HelloWorld" class="tutorial.HelloWorld">
<result>/HelloWorld.jsp</result>
</action>
</package>

拦截器的编写
编写权限控制器:

public class AuthorityInterceptor extends AbstractIntercepto r{
private static final long serialVersionUID = 1358600090729208361L;
//拦截Action处理的拦截方法
public String intercept(ActionInvocation invocation)throws Exception{
//取得请求相关的ActionContext实例
ActionContext ctx=invocation.getInvocationContext();
Map session = ctx.getSession();
//取出名为user的session属性
String user = (String)session.get("user");
//如果没有登录,或者登录所有的用户名不是aumy,都返回重新登录
if(user !=null && user.equals("aumy")){
return invocation.invoke();
}
//没有登录,将服务器提示设置成一个HttpServeletRequest属性
ctx.put("tip","您还没有登录,请登录系统");
return Action.LOGIN;
}
}

Struts2.xml配置文件:

<struts>
<include file="struts-default.xml'/>
<!-- 受权限控制的Action请求配置 -->
<package name="authority" extends="struts-default">
<interceptors>
<!-- 定义一个名为authority的拦截器 -->
<interceptor class="com.aumy.struts.example.intercepter.AuthorityInterceptor" name="authority"/>
<!-- 定义一个包含权限检查的拦截器栈 -->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack"/>
<!-- 配置内建默认拦截器 -->
<interceptor-ref name="authority"/>
<!-- 配置自定义的拦截器 -->
</interceptor-stack>
</interceptors>

<default-interceptor-ref name="mydefault"/>
<!-- 定义全局Result -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>

<action name="show" class="com.aumy.struts.example.LoginAction" method="show">
<result name="success">/show.jsp</result>
</action>
<action name="add" class="com.aumy.struts.example.LoginAction" method="add">
<result name="success">/add.jsp</result>
</action>
</package>
</struts>

还有一种方法拦截器,可以对某个action的方法进行拦截;编码类似action拦截器:

public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation)throws Exception{
System.out.println("use MethodFilterInterceptor");
String result = invocation.invoke();
return result;
}
}

只是在配置的时候和其他interceptor有些区别:

<interceptor name="myInterceptor3" class="com.langhua.interceptor.MyInterceptor3">
<param name="excludeMethods">execute,login</param>
<!-- execute, login两个方法不需要拦截>
<!-- addmessage 方法需要拦截,可以指明多个方法,只需要用逗号隔开 -->
<param name="includeMethods">addmessage</param>
</interceptor>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Friedy星期五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值