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. Bing Advanced Search Tricks You Should Know

    Bing is one of the world's most popular search engines that has gained many fans with its ease of us ...

  2. python web自动化测试框架搭建(功能&接口)——通用模块

    1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...

  3. 使用 Vagrant 搭建 Kubernetes 本地测试环境

    Vagrant 中文资料 参考资料 Kubernetes 需要一个至少包含三个节点的分布式系统.如果想学习 Kubernetes,或只是在本地搭建测试环境,则可以通过 Vagrant 来简单的实现. ...

  4. 16/8/23_CSS自动换行

    转载:http://blog.csdn.net/ye987987/article/details/8011875   自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺 ...

  5. 不同vlan之间相互通信

    不同VLAN之间相互通信的两种方式 (单臂路由.三层交换) 试验目的: 1.通过单臂路由实现不同VLAN之间的通信 2.通过三层交换路由功能实现不同VLAN之间的通信   网络拓扑图: 1.单臂路由实 ...

  6. Java中的基本类型和包装类型区别

    首先看一下几个测试题,验证一下java中对基本类型和包装类型的理解,看看最后输出的答案对不对,答案在这篇博客中哦: // 第一题: 基本类型和包装类型 int a = 100; Integer b = ...

  7. ELK日志分析系统之logstash7.x最新版安装与配置

    2 .Logstash的简介 2.1 logstash 介绍 LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上.不同于分离的代 ...

  8. 自定义SAP搜索帮助记录-代码实现

    一般来说,标准的字段都可以用SE11来创建搜索帮助,但是有时候这里的满足不了需求或者,相同的数据元素需要用不同的搜索帮助类型,就需要用别的方式实现 1.用函数:F4IF_INT_TABLE_VALUE ...

  9. vscode 在ubuntu的terminal中下划线不显示解决方案

    Ctrl+Shift+P,打开搜索,Perferences:Open User Settings 设置Editor:Font Family 为 'Ubuntu Mono', monospace 保存, ...

  10. golang的数据类型之整型类型

    数据类型: 整数 : int, int32, int64, uint, uint32, uint64 字符串 : string 布尔:bool 浮点:float32 float64 uint 表示无符 ...