1.新建一个web项目,目录结构如下,添加jar包到lib文件夹里,并把jar包add 到 buildpath里面

2.web.xml配置 struts2的过滤器类:StrutsPrepareAndExecuteFilter ,把全部请求定位到该Struts2过滤器中

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <filter>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

3. 通过实现Action接口的方式来创建一个处理请求的action类:

(1)Action接口中定义了public String execute()方法,来执行用户请求的处理,此外,该没看还定义了五个字符类型的静态常量,是Action默认支持的逻辑视图名

常量 逻辑含义
SUCCESS “success” 表示程序处理正常,并返回给用户成功后的结果
NONE "none" 表示处理正常结束,但不返回给用户任何提示
ERROR "error" 表示处理结果失败
INPUT "input" 表示需要更多用户输入才能顺利执行
LOGIN "login" 表示需要用户正确登陆后才能顺利执行

(2)Action类中的属性可以直接来接收用户的输入(也就是获取请求参数),单表单提交爱哦时,Struts2自动对请求参数进行转换并对具有相同名字的Action属性进行赋值(通过setter方法,因此Action类中接收请求参数的属性,必须要设置getter setter方法)

(3)Action类的属性除了用来接收请求的数据,还可以用来输出处理结果,仍然是借助get set方法对结果属性进行处理,如下例子中所示。

(4)Struts2中,系统不会识别哪些舒心用于接收请求参数,哪些属性用于输出处理结果,只要对属性设置了get set方法,该属性就可以被自动处理。

(5)Action类中还可以使用复杂的属性,如用户自定义类,数组,集合对象等

 package cn.test.action;

 import com.opensymphony.xwork2.Action;

 public class HelloAction implements Action {

     private String name=""; //Action类中定义的属性设置的set get方法,就可以接收前端传递过来的与该属性名同名的参数值
private Integer age=0;
private String msg; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} @Override
public String execute() throws Exception {
System.out.println("hello action");
System.out.println("name value is:"+this.name);
System.out.println("age value is:"+this.getAge());
if(this.getName().equals("admin")){
this.setMsg("this is message from HelloAction"); //设置返回给页面的消息
return SUCCESS;
} else {
return ERROR;
}
}
}

4.编写Struts2的配置文件

(1)package元素定义Struts2处理请求的逻辑单元,其name属性用来指定包的名称(必须指定,并且唯一,因为要用于被其他包引用),extends用于指定要扩展的包

(2)action元素用于配置Action类,用于把一个请求的URI对应到一个Action类,name属性表示action的名称,必须指定,class属性可选,用于设定action类的全限定名

(3)result元素用于指定逻辑视图名,name属性表示result的逻辑视图名称(就是上边HelloAction类的execute方法的返回值),必须与Action类返回的字符串匹配;result元素的值表示与逻辑视图名对应的物理资源之间的映射,用来指定这个结果对应的实际资源的位置    注意,<result name="success">/success.jsp</result> 中,有/表示使用的绝对路径,是当前web应用程序的上下文路径,<result name="success">success.jsp</result> 无/ 相当于当前执行的Action路径

(4)result元素如果没写name属性,默认是返回success对应的逻辑视图

(5)package中的namespace的值+action元素中name属性的值,确定了一个唯一的请求action的路径

(6)以下面这个action为例,如果action里面没有指定method方法,那么调用默认的execute方法,企业项目中,还是要在result元素里面加上method属性,指定处理请求的方法。

 <action name="helloStruts" class="cn.test.action.HelloAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
 <?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">
<struts>
<!-- 开启动态调用,并且设置启用开发者模式 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<constant name="struts.devMode" value="true"></constant> <package name="default" namespace="/user" extends="struts-default"> <!-- 配置默认的行为 ,请求里什么行为都不输入 http://localhost:8080/strutsstu1/user/ -->
<default-action-ref name="defaultAction"></default-action-ref>
<!-- 全局结果所有的错误都跳转到error.jsp -->
<global-results>
<result name="myexcept">/error.jsp</result>
</global-results>
<action name="defaultAction">
<result>/error.jsp</result>
</action>
<!-- http://localhost:8080/strutsstu1/user/helloStruts?name=admin&age=20
package中定义的namespace+action中的name,可以确定一个唯一的访问action的路径 -->
<action name="helloStruts" class="cn.test.action.HelloAction">
24 <result name="success">/success.jsp</result>
25 <result name="error">/error.jsp</result>
26 </action>

</package> <package name="user" namespace="/user" extends="struts-default">
<action name="login" class="cn.test.action.UserAction"
method="login">
<result>/login.jsp</result>
<!-- result不写name属性,默认就是success -->
</action>
<action name="register" class="cn.test.action.UserAction"
method="register">
<result>/register.jsp</result>
</action> <!-- 动态调用 -->
<action name="dyTest" class="cn.test.action.User2Action">
<!-- http://localhost:8080/strutsstu1/user/dyTest!login.action -->
<result name="gologin">/login.jsp</result>
<!--请求地址: http://localhost:8080/strutsstu1/user/dyTest!register.action-->
<result name="goregister">/register.jsp</result>
</action> <!-- 动态调用2 -->
<action name="*User" class="cn.test.action.User3Action"
method="{1}">
<!--http://localhost:8080/strutsstu1/user/deleteUser.action?value=admin-->
<result name="deleteadmin">/{1}admin.jsp</result><!-- deleteadmin -->
<result name="deletecommon" type="redirect">/{1}common.jsp</result> <!-- 请求中的*的值组装成deletecommon.jsp-->
<!--http://localhost:8080/strutsstu1/user/deleteUser.action?value=adminxxx-->
<!-- <result name="deleteerror">/{1}error.jsp</result> -->
<!-- -->
<result name="deleteerror" type="redirectAction">login</result> <!-- 相当于请求重定向到/user/login --> </action>
</package> <package name="service" namespace="/student" extends="struts-default">
<!-- http://localhost:8080/strutsstu1/student/stulogin.action -->
<action name="stulogin" class="cn.test.action.StudenAction"
method="studentLogin">
<result name="studentLoginSucess">/stuLogin.jsp</result>
</action>
<action name="sturegister" class="cn.test.action.StudenAction"
method="studentRegister">
<result name="studentRegisterSuccess">/stuRegister.jsp</result>
</action> <action name="stu" class="cn.test.action.StudenAction">
<!--http://localhost:8080/strutsstu1/student/stu!studentLogin.action-->
<result name="studentLoginSucess">/stuLogin.jsp</result>
<result name="studentRegisterSucess">/stuRegister.jsp</result>
</action>
</package> <package name="ognl" namespace="/ognl" extends="struts-default">
<action name="show" class="cn.test.action.OgnlAction">
<result>/show.jsp</result>
</action>
<action name="showArray" class="cn.test.action.ArrayAction">
<result name="success">/show.jsp</result>
</action>
</package> <!-- 拦截器 -->
<package name="intercepter" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myTime" class="cn.test.interceptor.MyTimeIntercepter"></interceptor>
<interceptor-stack name="myTimeStack">
<interceptor-ref name="myTime"></interceptor-ref> <!-- 把自定义的拦截器设置为栈的顶部 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="index">
<result>/index.jsp</result>
<interceptor-ref name="myTimeStack"></interceptor-ref> <!-- 让myTimeStack这个拦截器栈去进行拦截 -->
</action>
</package> </struts>

5.编写物理视图文件success.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'success.jsp' starting page</title>
</head> <body>
This is my success JSP page.
<br>
<!--<s:property value="name"/> value里面写上Action类中定义的属性,就能在jsp页面显示请求中所带的参数了 -->
显示struts action中的属性内容:<br>
采用OGNL与Struts2标签输出Action类的属性值(Action类获取到的请求参数值):<br>
name=<s:property value="name" />&nbsp;&nbsp; age=<s:property value="age" /> <br>
采用EL表达式 输出Action类的属性值(Action类返回给页面的值):<br>
msg=${msg };
</body>
</html>

在浏览器中输入 http://localhost:8080/strutsstu1/user/helloStruts?name=admin&age=20  并访问,结果如下,

6.Struts2应用的执行流程简单总结:

(1)浏览器发出user/helloStruts这个请求到服务器(web.xml中配置的url-pattern是/*)

 <filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

(2)服务器接收后,根据web.xml的配置,将请求分发给指定的Struts2过滤器

(3)过滤器根据Struts.xml的配置内容,将请求发送给cn.test.action.HelloAction类的对象,并调用默认的execute方法、

(4) 根据execute方法的返回结果,在struts.xml文件中匹配 逻辑视图名为success的处理结果(

 <result name="success">/success.jsp</result>),当execute方法的返回值为success字符串时,跳转到success.jsp页面

(5)页面根据上下文中的内容,借助Struts2的OGNL表达式和Struts2标签将内容显示在页面上,需要先导入Struts2的标签库:

<%@ taglib uri="/struts-tags" prefix="s"%>

示例代码下载地址   https://github.com/liuch0228/Struts2SSH.git 

Struts2基础-2 -实现Action接口创建Action控制器的更多相关文章

  1. Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI

    1.目录结构及导入的jar包 2.web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web ...

  2. JavaWeb_(Struts2框架)Struts创建Action的三种方式

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  3. Action的创建和配置

    计应134(实验班) 李佳鸿 Action类—Struts组件 在RequestProcessor类预处理请求时,在创建了Action的实例后,就调用自身的processActionPerform() ...

  4. Struts2不扫描jar包中的action

    今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...

  5. java之struts2的action的创建方式

    首先action是用来处理请求的, 这里struts2中的action的3中创建方式. 1.无侵入性的创建方式. 无侵入性:使用第三方的框架,不直接继承或实现第三方提供的类或者接口就说是无侵入性的. ...

  6. Struts2基础-4-2 -struts拦截器实现权限控制案例+ 模型驱动处理请求参数 + Action方法动态调用

    1.新建项目,添加jar包到WEB-INF目录下的lib文件夹,并添加到builde path里面 整体目录结构如下 2.新建web.xml,添加struts2核心过滤器,和默认首页 <?xml ...

  7. Struts2基础学习(二)—Action

    一.ActionSupport      为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范.下面是标准A ...

  8. struts2 之 Action的创建方式

    总结:struts2是一个轻量级框架,提供了无侵入性的实现方式,struts2也提供了接口和类来实现action.通过实现接口或者继承类来实现action可以实现struts2提供的相关功能, 1. ...

  9. SSH框架-Struts2基础-Action

    Struts2的目录结构: 解压apps目录下的struts2-blank.war: 仿照这个最基本的项目,拷贝相关文件: 1.拷贝apps/struts2-blank/WEB-INF/classes ...

随机推荐

  1. 2017华南理工华为杯D bx回文

    比赛的时候队友过了,补补题XD. 题目链接:https://scut.online/p/125(赛后补题) 125. 笔芯回文     题目描述 bx有一个长度一个字符串S,bx可以对其进行若干次操作 ...

  2. 432D Prefixes and Suffixes

    题目大意 给你一个串 对于一个子串如果它既是前缀又是后缀 输出它的长度以及它在原串中一共出现了多少次 分析 对于既是前缀又是后缀的判断和126B相同 然后我们只需要记录每个不同的z[i]出现了多少次 ...

  3. 牛客提高D6t2 破碎的序列

    分析 我们不难发现对于偶数的情况只要相邻两个数不相等即可 而对于奇数的情况只要中间恰好隔一个数的两个数不相等即可 于是我们又dp[i][0/1]表示考虑到第i位,这一位和它后面离它最近的一个确定的数是 ...

  4. PHP调试环境之:Eclipse for PHP

    Eclipse IDE for PHP Developers + Zend Debugger Feature . 在网上搜过一些朋友配置 eclipse --> php --> pdt , ...

  5. python time 和日期相关模块

    时间日期相关的模块 calendar 日历模块 time 时间模块 datetime 日期时间模块 timeit 时间检测模块 日历模块 calendar() 功能:获取指定年份的日历字符串 格式:c ...

  6. 普通ACL访问控制列表

    配置OSPF R1: R2: R3: R4: 在R1上查看OSPF的学习 测试R1与R4环回接口连通性 配置普通ACL访问控制列表: 先在R4配置密码用R1与R4建立telnet建立 密码huawei ...

  7. express框架中router组件的app.use和app.get

    首先看例子: var express = require('express'); var router = express.Router(); var index = require('./route ...

  8. 中标麒麟V6.0安装 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

    在中标麒麟6.0上安装mysql, 1.先从官网(https://dev.mysql.com/downloads/mysql/5.7.html#downloads)下载 . 我的选择如上图. 2.下载 ...

  9. Meet in the middle算法总结 (附模板及SPOJ ABCDEF、BZOJ4800、POJ 1186、BZOJ 2679 题解)

    目录 Meet in the Middle 总结 1.算法模型 1.1 Meet in the Middle算法的适用范围 1.2Meet in the Middle的基本思想 1.3Meet in ...

  10. P4929 【模板】舞蹈链(DLX)

    题目背景 本题是舞蹈链模板——精确覆盖问题 题目描述 给定一个N行M列的矩阵,矩阵中每个元素要么是1,要么是0 你需要在矩阵中挑选出若干行,使得对于矩阵的每一列j,在你挑选的这些行中,有且仅有一行的第 ...