一、为什么用struct2

设计模式就是将简单的问题复杂化,这样设计的好处是扩展性。

struct2经过structfilter中转,才能确定是哪个页面(展现),这样就可以将请求结果(视图),这样就将请求和展现分离开,可以方便视图的改变(只需在struct2中配置应该去哪个页面即可)

struct2就是解决将请求和展现分隔开

二、配置

①引入jar包

(2)简单体验---helloworld、namespace简单解读、Action简单解读_struts

②将web.xml中添加:

这部分可以在 E:\struts-2.1.8.1-all\struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF中找到,复制过来即可。

 <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


③配置structs.xml

在src根目录下

<struts>
<constant name="struts.devMode" value="true" /><!-- 开启使用开发模式,详细错误提示,否则得重新部署,才能将修改改动-->
<package name="default" namespace="/" extends="struts-default">
<action name="second" class="com.model.HelloAction">
<result >
/Hello.jsp
</result>
</action>

</package>

</struts>


④写控制器Action

public class HelloAction extends ActionSupport{
//每次执行Action都是新建的实例,构造函数都会执行
public HelloAction(){
System.out.println("构造函数执行。。。。。");
}

public String execute() throws Exception {


return "success";
}

}


Hello.jsp在WebRoot根目录下。

执行过程:

因为web.xml中配置了strut的过滤器,所以会在struct.xml中找命名空间(namespace),然后找对应的action执行,然后去往相应的页面。

就本例而言:namespace是”/” 。 action 是second

三、对namespace解读

package: 在Java中,包是避免action重名,在struct2中一样,不能重名

比如前台可以有action name=”index” 在后台中也有action name=”index”,则可以将前台的action设置在front包下,后台的action设置在behind包下。

    1、namespace 必须以"/"开头 
2、namespace 可以为空,当用户输入一个地址后,http://localhost:8080/struct_namespace/front/hello.action
若front名称空间下没有这个hello.action ,【有则访问】则在namespace="" 下寻找是否有hello.action ,若此时还没有,则会报错。


structs:代表项目,package:代表业务模块,action:代表某个模块中的组件。

一个structs元素,可以包含多个package子元素。一个package包可以包含多个action子元素
structs:代表项目,package:代表业务模块,action:代表某个模块中的组件。
由于一个项目包含多个包,若所有的package都放在一个包中,必然会导致大家争用这个配置文件,在实际开发中,一般将每个package放在一个单独的文件中,比如struct-xxx.xml
最后由struct.xml来引入这些子文件即可


四、对Action解读

对action来说,可以选择不同的类,​​class="com.model.HelloAction"​​ 这个类也决定了它在哪个Action中执行。比如在BBS开发中有模块、帖子、回复实体,那么可以创建sortAction、topicAction、responseAction,和servlet中写控制器是一样的思想。一个业务模块对应一个package,对应一个class。

对于Action,在action中可以指定用这个类的哪个方法​​method="add"​​ (当然也可以动态指定,以后再说)。

若不在action中指定,也不在jsp(目前的视图是jsp)中动态指定,则会默认执行excute方法。当然我们可以对excute方法进行重写,也可以指定通俗易懂的方法名,但是返回值必须是string类型。而且可以指定不同的返回值,比如登录,进行数据验证可以到登录错误界面,也可以进入用户的主页面。从这里也可以看出,一个method可以有多个返回值,返回值在struct.xml中的result标签接收,进行匹配。result的默认name为”success”,可以指定其他的名称。

 <result name="success">/mainFrame.jsp </result>
<result name="error">/>/login.jsp </result>
public String add(){
if(用户名、密码错误)
return "error";
return "success";
}

public String excute(){
// TODO Auto-generated method stub
return "success";
}


上面提到method动态指定:就是在struct.xml中不指定,在jsp页面提交请求时才指定。用!

<action name="second" class="com.model.HelloAction">//这里先不指定用哪种方法
在jsp页面:
比如一个超链接:
<a href="front/hello!add"></a>