Struts2的配置 struts.xml Action详解

网友投稿 229 2023-03-26


Struts2的配置 struts.xml Action详解

在学习struts的时候,我们一定要掌握struts2的工作原理。只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置。接下来我就先简单的讲解下struts2的框架工作原理:

一、struts2的工作原理

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的jsP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

二、部署一个struts2项目的一般步骤

1)在Myeclipse中创建一个web项目,并将struts2需要的jar包导入进项目中,如下图

2)在项目中的web.xml中进行配置struts2的框架,在web.xml中需要包含在,在该节点下可以包含

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

index.jsp

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

*.action

struts2

*.jsp

3)编写Action类

4)创建好了Action类中要对action进行配置struts.xml,注意该配置文件的位置要在src的根目录下

5)创建jsp的文件,进行测试

三、struts.xml的配置初探

先来看看struts的基本配置的大概情况

"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

"http://struts.apache.org/dtds/struts-2.1.7.dtd">

/success.jsp

/{1}.jsp

从上面的代码中可以看出,xml中包含的再根节点下下。在实际项目中的编写时,头部信息需要更改,那么我们给以在导入的jar中的jar包中进行获取

在struts-core-2.2.1.1.jar包下的struts2.0.dtd中进行获取。

四、struts.xml中的package的配置

看着前面的代码可以很清晰的看到package的属性

属性有:

1.     name:逻辑上的包名

2.     namespace:命名空间,用来区分同意struts下的相同action(注意是一种逻辑上的的路径)

3.     extends: 继承某个配置文件

4.     abstract

具体使用过程中要注意,有与命名空间的命名,我们要在相应的过程中加上对应的命名空间的路径,例如:

此代码说明的就是将会去调用db命名空间下的login对应的action

还需要注意的是:

标签的下的是物理路径(绝对路径),即指在项目中的实际位置,代码如下

/login/error.jsp

六、struts.xml中的result的配置

对于action的配置我这里面只是简单的概括,具体很多细节性的东西我将专门写一篇博客,主要讲解的动态的对action进行配置

属性有:

1.     name:Action类的映射名称

2.     class:Action类的完整路径

3.     method:默认使用的execute()方法,如果要自定义触发方法,需要使用method自定义

七、struts.xml配置过程中的注意信息

在实际开发的项目中,我们可能需要配置很多的action,有时候为了便于我们的分类,我们一般需要创建不同包下的struts-user.xml文件,不过最终我们的这些配置都是要导入进我们的struts.xml文件中。使用的标签和jsp编程中

struts.xml

[

"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

"http://struts.apache.org/dtds/struts-2.1.7.dtd">

struts-user.xml

"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

"http://struts.apache.org/dtds/struts-2.1.7.dtd">

method="execude2">

/login/success.jsp

/login/error.jsp

method="execude2">

/login/error.jsp

/login/success.jsp

一、Action的创建方法

1)实现Action接口

2)继承ActionSupport类,覆写其中的方法

3)不继承任何类都可以实现,关键是在struts.xml中进行配置

二、Action动态方法的调用

在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担

第一种方法:在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)

第二种方法: jsp页面中指定你要调用的那个方法

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

index.jsp

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

*.action

struts2

*.jsp

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

index.jsp

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

*.action

struts2

*.jsp

3)编写Action类

4)创建好了Action类中要对action进行配置struts.xml,注意该配置文件的位置要在src的根目录下

5)创建jsp的文件,进行测试

三、struts.xml的配置初探

先来看看struts的基本配置的大概情况

"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

"http://struts.apache.org/dtds/struts-2.1.7.dtd">

/success.jsp

/{1}.jsp

从上面的代码中可以看出,xml中包含的再根节点下下。在实际项目中的编写时,头部信息需要更改,那么我们给以在导入的jar中的jar包中进行获取

在struts-core-2.2.1.1.jar包下的struts2.0.dtd中进行获取。

四、struts.xml中的package的配置

看着前面的代码可以很清晰的看到package的属性

属性有:

1.     name:逻辑上的包名

2.     namespace:命名空间,用来区分同意struts下的相同action(注意是一种逻辑上的的路径)

3.     extends: 继承某个配置文件

4.     abstract

具体使用过程中要注意,有与命名空间的命名,我们要在相应的过程中加上对应的命名空间的路径,例如:

此代码说明的就是将会去调用db命名空间下的login对应的action

还需要注意的是:

标签的下的是物理路径(绝对路径),即指在项目中的实际位置,代码如下

/login/error.jsp

六、struts.xml中的result的配置

对于action的配置我这里面只是简单的概括,具体很多细节性的东西我将专门写一篇博客,主要讲解的动态的对action进行配置

属性有:

1.     name:Action类的映射名称

2.     class:Action类的完整路径

3.     method:默认使用的execute()方法,如果要自定义触发方法,需要使用method自定义

七、struts.xml配置过程中的注意信息

在实际开发的项目中,我们可能需要配置很多的action,有时候为了便于我们的分类,我们一般需要创建不同包下的struts-user.xml文件,不过最终我们的这些配置都是要导入进我们的struts.xml文件中。使用的标签和jsp编程中

struts.xml

[

"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

"http://struts.apache.org/dtds/struts-2.1.7.dtd">

struts-user.xml

"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

"http://struts.apache.org/dtds/struts-2.1.7.dtd">

method="execude2">

/login/success.jsp

/login/error.jsp

method="execude2">

/login/success.jsp

/login/error.jsp

method="execude2">

/login/error.jsp

/login/success.jsp

method="execude2">

/login/error.jsp

/login/success.jsp

一、Action的创建方法

1)实现Action接口

2)继承ActionSupport类,覆写其中的方法

3)不继承任何类都可以实现,关键是在struts.xml中进行配置

二、Action动态方法的调用

在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担

第一种方法:在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)

第二种方法: jsp页面中指定你要调用的那个方法

在客户端请求中进行动态的配置:映射名!方法名.action

这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置

第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法)

在配置 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用

//这种通配是针对的是同一个action中,响应不同的方法

在jsp页面中调用的时候

用户名:

密 码:


注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法

通过通配符实现,不同的类响应不同的类中的方法:

/{2}.jsp

三、 Action的动态结果的配置

含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。

UserAction.Java

public class UserAction extends ActionSupport {

private String nextResult;

...

}

Struts2.xml

/{nextResult}

四、接收用户数据(推荐使用的实现ModelDriven的接口)

在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。

实现ModelDriven接口

步骤:

u    实现用户登录功能

u    创建User.java类

Ø          声明用户登录信息

Ø          创建无参构造

u   创建Action类

Ø          实现com.opensymphony.xwork2.ModelDriven接口

Ø          声明User类对象并实例化

Ø         实现getModel ()方法,返回User类对象

u    创建JSP页面

Ø         表单元素使用”属性”设置name属性

注意:

1)  首先,action要实现ModelDriven的接口,默认实现getModel()方法

2)  要在action中自己来实例化user的对象,而不像前面一种方法是有struts2的框架实现的

3)  比较突出的就是在jsp页面中,表单元素的name属性,直接用名字就可以来

UserAction.java

public class UserAction implements ModelDriven {

//要实例化

private User user=new User();

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public String myfun() throws Exception {

System.out.println("username="+user.getUsername());

System.out.println("password="+user.getPassword());

System.out.println("myfun.....");

//用来进行处理

if(user.getUsername().equals(user.getPassword())){

return "success";

}else{

return "error";

}

}

public User getModel() {

// TODO Auto-generated method stub

return user;

}

}

login.jsp

用户名:

密 码:


五、在Action中访问Servlet API

访问Servlet API的实际项目中有两种的方法访问Servlet API

1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware)

public class UserAction2 implements ModelDriven ,RequestAware,SessionAware,ApplicationAware{

private User user = new User();

private Map requestMap;

private Map sessionMap;

private Map applicationMap;

public void setApplication(Map applicationMap) {

this.applicationMap=applicationMap;

}

public void setSession(Map sessionMap) {

this.sessionMap=sessionMap;

}

public void setRequest(Map requestMap) {

this.requestMap=requestMap;

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public String myfun() throws Exception {

System.out.println("username=" + user.getUsername());

System.out.println("password=" + user.getPassword());

System.out.println("myfun2.....");

// 用来进行处理

if (user.getUsername().equals(user.getPassword())) {

sessionMap.put("Succ", "成功的哇2!!!");

Bookbiz bookbiz=new Bookbiz();

http://applicationMap.put("books",bookbiz.getBooks());

return "success";

} else {

requestMap.put("errorMsg", "登陆失败了2");

return "error";

}

}

public User getModel() {

// TODO Auto-generated method stub

return user;

}

注意:在非解耦的方式中,struts2框架已经将对应的四大应用作用域给封装到了Map集合中,所以这里一开始定义的三个Map集合中可以相当于操作四大作用域对象

2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象

public class UserAction4 implements ModelDriven,ServletRequestAware,ServletContextAware{

private User user = new User();

private HttpServletRequest request;

private HttpSession session;

private ServletContext application;

public void setServletContext(ServletContext application) {

this.application = application;

}

public void setServletRequest(HttpServletRequest request) {

this.request = request;

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

………………

注意:在实现接口中只实现了request和application的获取

在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession();


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:捕获未处理的Promise错误方法
下一篇:多短信接口管理平台(短信api接口juliangyun)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~