准备工作:导入struts2依赖jar包
在web.xml添加struts2过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
一、struts.xml中的一些配置,及对这些配置的解释:
<package name="itcast" namespace="/test" extends="struts-default">
<action name="helloword" class="cn.itcast.action.HelloWordAction" method="execute">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
name="itcast":包的名称可以是任意的,但必须是唯一的
包名作用:其他包继承该包时需要使用包名
namespace="/test":命名空间作为访问该包下action路径的一部分,相对于struts1而言有减少重复代码的作用
extends="struts-default":通常每个包都应该继承struts-default包, 因为Struts2很多核心的功能都是拦截器来实现。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。 struts-default定义了这些拦截器和Result类型。可以这么说:当包继承了struts-default才能使用struts2提供的核心功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。
包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action。只能被其他包继承
Action名称也可以作为访问action路径的一部分,当请求到达时会交给execute去处理
<result name="success">/WEB-INF/page/hello.jsp</result>
定义视图,success是视图的名字,/WEB-INF/page/hello.jsp视图的路径
在struts的配置文件中可以配置多个action
为什么jsp文件要放在WEB-IN下?
只能通过访问action后再去访问页面,不希望用户直接访问jsp所以放在WEB-INF下。如果放在外面,用户可以通过浏览器直接访问到jsp页面,但是里面没有数据,因为jsp中的数据需要从action中传过来,直接访问也是没有意义的
二、action中的操作
cn.itcast.action包下的类HelloWordAction
public class HelloWordAction {
private String msg;
public String getMessage() {
return msg;
}
public String execute(){
msg="我的第一个struts2应用";
//请求结束时希望返回什么请求,就返回什么请求就可以了
return "success";
}
}
三、jsp中获取数据并显示出来
Hello.jsp
<!-- 通过EL表达式获取 -->
${message}
注意:EL表达式中,所访问的参数不是action中定义的变量,而是getXX()方法中的XX,首字母要小写(例如:访问的不是msg而是message),通过反射机制调用action中的getXX()方法
Action中没有用到框架中的一些类,可以看出struts2属于无侵入式设计
访问时,前部分是命名空间,然后是action的名字
访问路径:http://localhost:8080/struts2/test/helloword