一、入门案例
1、编写Action动作类
package cn.itcast.web.action;
/**
* 用于处理请求的类
*
* 在struts2中把用于处理请求类都称之为:动作类
*
*/
public class HelloAction {
/**
* 用于处理请求的方法
*
* 把动作类中用于处理请求的方法都叫做:动作方法
*
* 动作方法有编写规范:
* 访问修饰符都是public
* 返回值必须是String类型的
* 方法不能有参数
* @return
*/
public String sayHello(){
System.out.println(this);
System.out.println("HelloAction中的sayHello方法执行了。。。。");
return "success";
}
}
2、配置struts.xml配置文件
<package name="p1" extends="struts-default">
<action name="hello" class="cn.itcast.web.action.HelloAction" method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
3、编写jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>struts2的入门案例</title>
</head>
<body>
<%--struts2框架它默认会拦截以.action为后缀的请求,或者是没有任何后缀的请求 --%>
<a href="${pageContext.request.contextPath}/hello.action">访问struts2的入门案例.action</a>
<hr/>
<a href="${pageContext.request.contextPath}/hello">访问struts2的入门案例</a>
</body>
</html>
二、struts2的执行流程
三、struts2中的配置文件
1、struts2的 6 个配置文件
default.properties、struts-default.xml、struts-plugin.xml、struts.xml、struts.properties、web.xml
加载时机是:在项目启动时就开始加载。
加载顺序:按照上述顺序加载。
注意:遇到相同的配置信息时,后加载的会覆盖先加载的
2、default.properties配置文件
注意:default.properties中的内容坚决不允许改动
(1)、位置:
3、struts-default.xml
注意:该配置文件内容不能修改
位置:
4、struts-plugin.xml
位置:插件包jar包中,没有导插件包时不存在
5、struts.xml 和 struts.properties
位置都在应用中,用于配置我们自定义的参数,推荐使用struts.xml进行配置
6、web.xml
作用:给过滤器配置参数
四、struts.xml中标签详解
1、constant标签
(1)、作用
配置struts2的常量
键值对形式,key、value
<!-- 开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
(2)、常用的常量
2、package标签
<!-- package标签详解:
作用:建立一个包,把我们的动作配置按照面向对象的思想来管理。
属性:
name:指定包的名称。必须写,必须唯一。
extends:指定当前包的父包。子包自动具备父包的配置。我们的包一般都需要继承struts-default包。
该包中配置着struts2的核心,如果不继承该包,则不能使用struts2的核心。
struts-default包在struts-default.xml配置文件中定义着。
abstract:把当前包声明为抽象包。抽象包就是用来被继承的。里面定义的公共配置。
只有没有action标签的包,才能声明为抽象包。
namespace:指定当前包的名称空间。当包上指定了名称空间之后,访问URL就变成了:
url = 名称空间+action标签的name取值
它的作用就是把访问URL按照模块化来管理。
名称空间的写法:
必须以/开头
后面的第一个字符必须是字母。
例如:
/n /n1 /namespace1
访问URL就变成了:
/n1/hello
体现模块化管理URL的例子:
名称空间是:/user
访问URL:
/user/addUser.action /user/updateUser.action.....
当我们不指定名称空间时,它有默认值:
默认值是:""
-->
<package name="myDefualt" extends="struts-default" abstract="true">
<!-- 此处定义的就是当前项目中的公共配置 -->
</package>
<package name="p1" extends="myDefualt" namespace="/n1">
<action name="hello" class="cn.itcast.web.action.HelloAction" method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
3、action标签
<package name="p1" extends="struts-default">
<!-- action标签详解:
作用:建立动作名称,动作类和动作方法的对应关系。
属性:
name:指定动作名称。它不能重复
class:指定动作类的全限定类名。
method:指定动作方法名称。
创建动作类的三种方式:
第一种方式:无侵入式的创建 实际开发中不常用
例子:HelloAction。
它的特点就是:没有任何struts2的代码体现。
第二种方式:实现Action接口的方式 实际开发中用的也不多
例子:Hello2Action
它的特点就是:Action接口中定义了一些常量,还是没有一些核心内容定义。
默认动作方法:
execute方法。当我们执行此方法时,可以不指定method属性
第三种方式:继承ActionSupport 实际开发中采用的方式
例子:Hello3Action
默认动作类:
ActionSuppor是默认动作类
-->
<action name="hello" class="cn.itcast.web.action.HelloAction" method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
<!-- 使用通配符来配置 -->
<package name="user" extends="struts-default">
<action name="*" class="cn.itcast.web.action.UserAction" method="{1}">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
<!-- 升级通配符 -->
<package name="user" extends="struts-default">
<action name="*_*" class="cn.itcast.web.action.{2}Action" method="{1}{2}">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
动态方法调用
struts.xml中:
<!-- 开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="user" extends="struts-default">
<action name="user" class="com.itheima.web.action.UserAction" >
<result name="success">/success.jsp</result>
</action>
</package>
jsp页面中:
<a href="${pageContext.request.contextPath}/user!addUser.action">添加用户</a>
<a href="${pageContext.request.contextPath}/user!updateUser.action">修改用户</a>
<a href="${pageContext.request.contextPath}/user!deleteUser.action">删除用户</a>
<a href="${pageContext.request.contextPath}/user!findUser.action">查询用户</a>
4、result标签
作用:配置结果视图的地址
<action name="demo1" class="cn.itcast.web.action.Demo1Action" method="demo1">
<!-- result标签:
作用:配置结果视图的地址。
属性:
name:用于和动作方法的返回值比较,当一致时前往指定的位置。
type:用何种方式前往(请求转发,重定向)
常用的取值:
dispatcher:请求转发到一个指定jsp页面(默认值)
redirect:重定向到一个指定的jsp页面或者是一个action
redirectAction:重定向到一个指定的action
-->
<result name="login">/success.jsp</result>
<result name="error" type="redirect">/error.jsp</result>
<result name="findAll" type="redirect">findAllCust</result>
<result name="findAll" type="redirectAction">findAllCust</result>
</action>
五、创建动作类的三种方式
1、无侵入式
特点:没有任何struts2代码的体现,实际开发中不常用
public class HelloAction {
public String sayHello(){
System.out.println(this);
System.out.println("HelloAction中的sayHello方法执行了。。。。");
return "success";
}
}
2、实现Action接口
特点:Action接口中定义了一些常量,还是没有一些核心内容定义。
默认的动作方法:execute方法。当我们执行此方法时,可以不指定method属性
import com.opensymphony.xwork2.Action;
public class Hello2Action implements Action {
@Override
public String execute() throws Exception {
System.out.println("Hello2Action的execute方法执行了");
return ERROR;
}
}
3、继承ActionSupport方式
import com.opensymphony.xwork2.ActionSupport;
public class Hello3Action extends ActionSupport {
}