您的位置:首页 > 编程语言 > Java开发

Day43-Struts01

2017-08-06 16:22 71 查看

一、Struts介绍

Struts框架其实就是对之前的servlet进行了包装。让我们写很少的代码即可完成web的请求和处理。所以在学习struts的时候,尽量跟servlet对比,就会发现很多相似之处。

Struts 是 Apache软件基金会(ASF)赞助的一个开源项目 , 它通过采用servlet 和 JSP 实现了基于Java EE Web应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

Struts 早起发布的版本是 1.x 版本, 后来和另一个也很优秀的EE框架 WebWork 一起整合 ,就形成了我们目前熟悉的Struts2.x





二、Struts 入门

以一个案例来入门Struts的用法:

1)导入jar包

官方下载的包里面有很齐全的jar包,一共有106个,但是我们平常的开发都不会用到这么多。

在apps文件夹下有许多的war工程,其中blank工程就是一个空的工程所必须的jar包。将struts2-blank.war的后缀名修改成为rar或者zip,然后进行解压,在web-inf下面的lib中有Struts所必须的jar包(13个)。可以满足基本的需求了。

2)新建一个类,里面放置一个execute方法 //默认是执行execute方法

public class ActionDemo {

public void execute(){

System.out.println("执行了请求了~~~");

}

}


3)配置sturts.xml

src底下新建一个xml 名称为 struts.xml

4)在struts.xml里面配置action

一个package就表示一组业务,继承了一个自带的包struts-default

namespace的默认只是空串“”

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 这段代码如何找,导入的jar包中找到struts2-core-2.3.32.jar包,下方有struts-2.3.dad,点开这个文件就可以找到这段约束
-->

<!-- 配置action -->
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="demo" class="com.itheima.test.ActionDemo"></action>
</package>
</struts>


5) 在web.xml里面配置过滤器(也有称之为 前端控制总栈 )

web.xml是配置struts的核心控制器的配置

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!--这个类如何找,核心jar包,按上面class的路径-->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


三、Struts运行过程

因为配置了前端过滤器filter,里面配置了类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilte,所以会去找这个类,这个类相当于一个servlet,有一个初始化方法init();

init()方法有这么一段代码:dispatcher = init.initDispatcher(config);点进去,在dispatcher.init()代码,点进去,会发现他初始化所做的一系列操作

项目部署

执行过滤器的init方法

前端拦截器先找到类:

在init方法里面有这样的一行代码 dispatcher = init.initDispatcher(config);

init_DefaultProperties(); // [1]  ---> 加载 default.properties
init_TraditionalXmlConfigurations();
// [2] ->加载 struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --->  加载struts.properties

init_CustomConfigurationProviders(); // [5] ---> 加载自定义的一些初始化类. 一般不写
init_FilterInitParameters() ; // [6]  ---> 加载初始化参数。 initparam
init_AliasStandardObjects() ; // [7] ---> 给对象起别名


【1】加载default properties,在主包里面有
【2】加载三个文件
【3】加载struts.properties
【5】加载自定义的初始化类,一般不写
【6】加载初始化参数
【7】给对象起别名


一般关注上面三个。我们一般只写struts.xml

Struts-default.xml里配置的拦截器。

Default.properties默认已配置所有的常量,根据需求可以在struts.properties,web.xml,struts.xml配置文件里配置常量

2.请求到来



四、配置详解

sturts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<!-- 配置action -->
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="demo" class="com.itheima.test.ActionDemo">
<result name="success" type="redirect">/other.jsp</result>
</action>
</package>
</struts>


4.1package解释

package:一个package就是一组业务的集合,package: 用于表示一组业务,里面的action表示一个请求动作, 主要方便维护、以及struts 能够快速找到具体的类

* name:表示package的别名,一般不建议重复,我们针对用户的操作有很多请求 。 用户的添加 、 用户的删除 、用户的修改…

* extends,这个package继承指定的package,struts-default 这也是一个package,这里面包含了很多的拦截器,一般我们都会使用到这些拦截器。这个struts-default 其实是 框架里面有一个 struts-default.xml 里面有声明一个package ,名字就叫struts-default ,这里写上extends其实是跟它形成一种关系。

* namespace:命名空间,直接写/表示根目录,表示在根目录下面再加入一个自路径,用意就是在根目录下面再加一个子路径才能访问到action。默认是空串的值

4.2action解释:

一个动作就是一个action,就是一个请求配一个action,和以前的一个请求配置一个servlet相似,

如上述访问的时候就是–工程名/demo 或者是 工程名/demo.action,action是默认的后缀名,可以通过配置文件进行配置的。

* name就是别名,一般就写方法名或者这个动作的名称

* class,action的全路径地址

* method:访问这个action中的某个方法,推荐使用通配符方式(告诉struts框架,找到那个类之后,执行什么方法)

4.3 result:

执行完结果之后,返回什么结果给浏览器,这个result 可以重复配置,但是name 不要一样, 保证一对一的关系。 之所以能够配置多个result,

那是因为我们在执行某个方法之后,可能会产生多种结果,我们需要针对每一种结果都进行判定。

name就是action的方法返回值,struts会拿着方法的返回值过来找到匹配的result,从而进行页面的跳转(一个action可以配置多个result,因为有可能执行会有多种结果出现)

默认情况走的是请求转发,type=‘redirect’表示重定向

结果还是可以跳转action的(去看看官方文档。)

<result name="success" type="redirect">/other.jsp</result>
使用重定向跳转到other.jsp
<result name="error">/login.jsp</result>
使用请求转发跳转到login.jsp


五、Action的通用写法

1)普通类的方式

2)实现接口Action

3)继承ActionSupport类(推荐)

5.1采用普通类写法

public class ActionDemo {
public String execute(){
System.out.println("execute333 ~~~~");
return "success";
}
}


5.2采用实现Action接口方式

import com.opensymphony.xwork2.Action;

public class ActionDemo2 implements Action {

@Override
public String execute() throws Exception {
System.out.println("execute2222执行了~~~");
return SUCCESS;
}
}


5.3采用继承ActionSupport方式

未来写action都采用这种方式去做。 因为它除了实现接口,提供了一些常量之外,还额外实现了其他接口。 我们可以轻而易举的使用他们来完成一些数据回显 、 国际化的功能。

import com.opensymphony.xwork2.ActionSupport;

public class ActionDemo03 extends ActionSupport{

@Override
public String execute(){
System.out.println("actionDemo03 execute ~~");
//登陆失败 --》request.setAttribute("msg","用户名或者密码错误了~");
addActionError("用户名或者密码错误了");
return SUCCESS;
}
}


六、Action的访问策略

主要讲解的就是访问除了execute方法之外的其他方法。

1)使用method属性匹配

2)采用通配符访问Action方法(推荐使用)

3)采用动态方法访问开关

6.1使用method属性匹配

method里面直接写方法的名字即可,这个时候,就能执行一个你的方法了。

缺点:死板,一个action这样只能调用一个方法

public class ActionDemo extends ActionSupport{
public String add(){
System.out.println("访问了add方法~~~");
return SUCCESS;
}
}


struts.xml里面的配置

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<!-- 配置action -->
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="demo" class="com.itheima.test.ActionDemo3" method="add">
<result name="success" type="redirect">/other.jsp</result>
</action>
</package>
</struts>


6.2采用通配符访问 Action方法【推荐使用】

解决了一个Action有多个方法的时候,我们需要配置多个Action标签的问题。 ,现在只需要配置一个action标签即可,然后采用 * 通配符的方式起来访问action的方法

public class ActionDemo extends ActionSupport{
public String add(){
System.out.println("访问了add方法~~~");
return "add_success";
}
public String update(){
System.out.println("访问了update方法~~~");
return "update_success";
}

}


struts.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<!-- 配置action -->
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="demo_*" class="com.itheima.test.ActionDemo3" method="{1}">
<result name="success" type="redirect">/other.jsp</result>
</action>
</package>
</struts>


6.3采用动态方法访问【不推荐使用】

打开动态方法访问开关

struts.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<!-- 配置action -->
<struts>
<!-- 打开动态访问的开关 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="demo" extends="struts-default" namespace="/">

<action name="demo" class="com.itheima.test.ActionDemo3">
<result name="add_success" type="redirect">/other.jsp</result> <!-- 添加成功 删除成功 -->
<result name="update_success" type="redirect">/other.jsp</result> <!-- 添加成功 删除成功 -->
</action>
</package>
</struts>


2.直接访问action

localhost:8080/项目名/demo!add —> action名称 + ! + 方法名

小结:Struts使用步骤:

1)导入jar包到lib文件夹中

2)配置web.xml,配置里面的filter属性(前端控制总站)

3)配置struts.xml,配置具体的action的映射

4)编写Action
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts mvc java