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. HDU6424 Rikka with Time Complexity

    HDU6424 Rikka with Time Complexity 数学题~(真的数学题) #include <bits/stdc++.h> #define mp(_,__) make_ ...

  2. 五一清北学堂培训之数据结构(Day 1&Day 2)

    Day 1 前置知识: 二进制 2.基本语法 3.时间复杂度 正片       1.枚举 洛谷P1046陶陶摘苹果  入门题没什么好说的 判断素数:从2枚举到sqrt(n),若出现n的因子,则n是合数 ...

  3. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

  4. 《STL源码剖析》——第一、二、三章

     第一章:概论: 换句话说,STL所实现的,是依据泛型思维架设起来的一个概念结构.这个以抽象概念(abstract concepts)为主体而非以实际类(classes)为主体的结构,形成了一个严谨的 ...

  5. Jquery的Ajax实现异步刷新

    在Jquery中提供了一套ajax的方法,有: $.ajax([data],fn) load(url, [data], [callback]) $.get(url, [data], [callback ...

  6. 复制书稿 (dp+贪心)

    [题目描述] 现在要把m本有顺序的书分给k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三和第四本书给同一个人抄写 ...

  7. Codeforces - 1191B - Tokitsukaze and Mahjong - 模拟

    https://codeforces.com/contest/1191/problem/B 小心坎张听的情况. #include<bits/stdc++.h> using namespac ...

  8. Ioc和DI之间的关系(依赖注入的核心概念)

    1.开篇闲话 由于之前做的很多项目都没接触到这个,后来到了另一个公司,他们的代码结构是基于领域驱动设计的,其中里面的对象都是通过依赖注入方式(Sprint.NET)实现的,也大致了解了哈,在网上搜了些 ...

  9. 各种设备在linux中的文件名

    各种设备在linux中的文件名: 设备         设备在linux内的文件名 ide硬盘 /dev/ha[a-d] scs硬盘 /dev/sd[a-p] u盘 /dev/sd[a-p](与SAT ...

  10. css样式表的引入方式

    一般来说,css 有两种样式表的引入方式,在这里我记录一下,比较这两种引入方式的区别: <link rel="stylesheet" type="text/css& ...