Struts2学习总结(完整版)

Struts2学习总结(完整版)

一、搭建struts2环境

1、jar包的导入

主要是到

 

 

解压其中的一个工程,得到里面lib下包含的jar

 

 

 

 

把这里的所有的jar包拷贝到项目的

WEB-INF目录下的lib文件夹下面。

 

2、配置struts.xml文件

注意:必须要放在src目录下,因为struts2源码就是这样设计的,只有在src目录下才读取得到。

 

 

每一个package都要extends=”struts-default”namespace 是 访问的路径

    

 

Action中的namepackage中的namespace组成完整的访问路径

 

3、配置web.xml

<filter>

        <filter-name>action2</filter-name>

<filter-class>

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

</filter-class>

</filter>

<filter-mapping>

        <filter-name>action2</filter-name>

        <url-pattern>/*</url-pattern>

</filter-mapping>

 

 

4、编写的Action类都要继承ActionSupport类或者implements Action接口

 

  默认action类访问的是里面的execute方法

 

 

如果要访问特定的方法,可以这样:

(1)action 后面指定 method=“方法名”

(2)使用通配符  <action name=”example_*”  class=”com.XX.YY.ZZ” method=”{1}” />

(3)使用动态表达式  比如example!execute(不常用)

 

5、接收表单提交的数据

(1)属性驱动获取表单参数

--action类中定义与表单的input中  name  一样的属性(必须一样,否则注入不进去)

同时还要生产属性对应的set 方法,因为 action类要调用set方法把表单中的参数注入到属性中

(2)模型驱动获取表单参数

--模型驱动首先action类要实现ModelDrivern,然后重写getModel方法

--action类中声明并创建接收表单参数的实体类(Student user = new Student())

--原理分析:struts2调用action类的getModel方法,得到user对象,然后利用user对象里面的set属性的方法,设置user对象的属性值

--注意,表单的参数name必须要跟Student的属性值一致,否则注入不进去。

(3)表达式驱动获取表单数据

--表单提交的时候要注明是哪个类的,比如user.name

--然后action类要生成user对象的get方法,可以让struts2获取到actionuser对象,然后调用user对象里面的get set方法,把参数注入到user对象的属性中去。

--表达式驱动的方式的好处是,表单可以传递多个不同pojo的对象上来,比如不仅可以上传user的,也可以上传book的。这样,在表单中input中表明 name的时候,写上  user.xxx  book.xxx

--表达式还支持  map list 表单,可以同时上传多分一样的参数(不常用)

Map[“one”].name -> getMap<String , Student>

List[0].name    -> getList<Student>

下面的图是参考这货的

http://www.cnblogs.com/lolybj/tag/struts2/

 

 

 

6、把要显示的数据传给前端JSP页面

  原理是利用到struts2的值栈空间,每一次request请求,都会重新创建出一个action类出来,然后在执行action类的方法之前,要经过一系列拦截器的拦截,比如ModelDrivern过滤器进行表单参数的注入。放行后才执行action方法。

以下是action类在值栈中设置数据的三种方法:

1、执行action方法的时候,可以获取ValueStack,并向ValueStack中插入数据。

2、直接在action类中定义pojo类,并创建好实例,生成get方法,方便jsp那边获取。

3、直接在action类中定义list对象,并将pojo类存入到list对象中去。

设置完之后,就会跳转到指定的jsp页面。

在指定的jsp页面中必须导入<%@ taglib uri="/struts-tags" prefix="s" %> 

Struts2的表达式,其实这个表达式底层调用的是ognl表达式,所以一开始的时候要导入ognl表达式的jar包。

Jsp中获取值栈的数据。有3中方式

1、<s:property value=”插入值栈的变量名”/>

2、<s:iterator value=”list” >

   <s:property value=”user.username”/>   //对象名称.对象属性

   <s:property value=”user.password”/>

        </s:iterator>

    3<s:iterator value=”list” var=”user”>

   <s:property value=”#user.username”/>   //对象名称.对象属性

   <s:property value=”#user.password”/>

        </s:iterator>

3种为什么要加#号,那是因为 iterator遍历的时候,先把list中的元素对象先存储到context的值栈空间里,context值栈空间的数据结构是map 的。所以要提供user作为键值,获取到user对象,然后根据对象的get方法,得到user的属性值。

这里要说明一下,action的值栈空间有两部分组织,一部分是root空间,数据类型是list类型的;另一部分是context空间,数据类型是map的。

 

7、最后是拦截器

拦截器和过滤器是不同的概念的东西;

过滤器:在容器上运行的,会过滤htmlimage... 网页文件。理论上是过滤所有的网页的

拦截器:只是拦截某一个action操作的

 

拦截器主要运用是 AOP 和 责任链的设计模式。所以可以做到在创建action类对象后,但是在执行action方法之间执行。

 

posted on 2017-03-17 14:57 卧似长剑 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/chencanjian/p/6566186.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开word时出现“在加载ThisDocument时出现错误”

有可能软件兼容性不行或者就是安装时没有安装正版软件&#xff0c;有些模块没有加载进去就无法打开文件现在有office 2007 建议保存的时候保存成97-03兼容模式

w ndows10电脑配置看哪里,Windows10怎么自动登录?Windows10自动登录的设置方法

在Windows10系统的默认状态下&#xff0c;我们登录系统是需要输入密码的&#xff0c;虽然输入登录密码可以较好的保护系统的安全&#xff0c;但是确实麻烦了不少&#xff0c;因此很多用户想要设置Windows10自动登录&#xff0c;那么该如何操作呢&#xff1f;下面小编给大家介绍…

联想电脑g470 vs2010很卡 问题解决

联想电脑g470 vs2010很卡&#xff0c;尤其是aspx设计器&#xff0c;根本都输入不了文字。 解决办法在桌面右键&#xff0c;显示卡属性&#xff0c;电源&#xff0c;可切换显示卡方式&#xff0c;选择手动或根据电源选择图形处理器&#xff0c;最后点应用…等几秒在看下效果

前端学习(2329):angular之路由

app.component.css .us{color: red; } .active{color: aquamarine; }app.component.js <div style"text-align:center"><h1>welcome to {{title}}</h1><div style"color:#f00000">我是歌谣</div><div>{{name}}</…

做一个常规的banner图——负边距的使用、banner图的拼法

在这之前&#xff0c;首先要了解如何设置块级元素在块级元素水平居中 方法&#xff1a; 设置子容器为定位元素水平居中 left&#xff1a;50%&#xff1b;margin-left&#xff1a;-width/2&#xff1b;垂直居中 top&#xff1a;50%&#xff1b;margin-top&#xff1a;-width/2&a…

C语言1094题目,P1094 (C语言代码)

解题思路:砍成1X1的单位方块&#xff0c;需要n*m-1刀。如果说&#xff0c;横、纵方向的每一刀的代价都一样的话。那很简单&#xff0c;n方向最少砍n-1刀&#xff0c;同理m方向最少要砍m-1刀&#xff0c;(自己画图看看)。那么剩余的那几刀分给代价最少的去砍&#xff0c;min(n-1…

TFS 表字典(部分)

在TFS2008中&#xff0c;版本库为TFSVersionControl&#xff0c;TFS2010中&#xff0c;版本库位TFS_集合名称 tbl_Lock锁WorkspaceId工作空间编号FullPath文件路径tbl_Workspace工作空间WorkspaceName工作空间名称tbl_Content文件内容&#xff08;每个版本一个新的文件&#xf…

前端学习(2331):angular之图片的使用

app.component.css .us{color: red; } .active{color: aquamarine; }app.component.js <div style"text-align:center"><h1>welcome to {{title}}</h1><div style"color:#f00000">我是歌谣</div><div>{{name}}</…

android自定义控件几种,Android 自定义View一个控件搞定多种水波纹涟漪扩散效果 - CSDN博客...

效果图实现思路这个效果实现起来并不难&#xff0c;重要的是思路此View满足了多种水波纹涟漪扩散效果&#xff0c;这要求它能满足很多的变化根据上面的样式&#xff0c;可以看出此View需要满足以下变化圆圈从中心可循环向外扩散圆圈之间的扩散间距可以改变可控制扩散圆的渐变度…

centos7 hadoop3.0.1安装

安装JDKrpm -qa | grep java找出OPENJDKyum -y remove java 上一步复制的jdk文件名卸载openjdkrpm -ivh jdk文件名安装jdk设置jdk环境变量需要修改配置文件/etc/profile&#xff0c;追加export JAVA_HOME"/usr/java/jdk-10"export PATH$JAVA_HOME/bin:$PATH修改完毕后…

excel函数怎么用android,在Android中阅读Excel

对于那些需要使用全功能excel文件(即绘图,VBA等等)的应用程序,你应该使用Apache POI,它很简单,但现在仍然是最好的解决方案.但是,如果您只需要阅读Excel,那么使用JavaScript解决方案可能会更好.使用js-xlsx库,您可以将Excel文件传输到JSON.库大小很小,只有395KB(仅包括xlsx.cor…

.net core2.0 Memcached.ClientLibrary

Memcached的.net core2.0驱动dll 引用了nuget包log4net和SharpZipLib.NETStandard nuget包名为Memcached.ClientLibrary.NetStandard 可以直接通过nuget搜索安装 地址https://www.nuget.org/packages/Memcached.ClientLibrary.NetStandard/ 源码详见 https://github.com/wa…

python设置格式模板

# -*- coding: utf-8 -*- """ __mktime__ ${DATE} __author__ ${USER} __filename__ ${NAME} """ if __name__ "__main__": pass 转载于:https://www.cnblogs.com/BigFishFly/p/6580692.html

给android应用程序默认的菜单添加一个菜单项关于,android菜单详解

1.菜单的生成对一个Android应用中的每一个屏幕&#xff0c;也就是说&#xff0c;对每一个Activity类&#xff0c;都会拥有一个默认菜单。在Activity类中&#xff0c;定义了几个与菜单有关的方法&#xff0c;供继承于Activity类的子类去重载&#xff0c;从而定制我们自己的菜单。…

Eclipse Memory Analysis分析Java运行内存情况

获取java进程的dump文件jmap -dump:formatb,file<dumpfile.hprof> <pid>安装Eclipse Memory AnalysisHelp 》 Install New Software输入地址&#xff1a;http://archive.eclipse.org/mat/1.0/update-site/安装点击右侧Open Perspective选Memory Analysis插件&#…

C#对用户密码使用MD5加密与解密

C#中常涉及到对用户密码的加密于解密的算法&#xff0c;其中使用MD5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验&#xff0c;分享给大家。 一.使用16位、32位、64位MD5方法对用户名加密 1&#xff09;16位的MD5加密 ?123456789101112/// <sum…

android默认代码混淆,Android SDK默认混淆配置文件

一.介绍通常情况下编译后的字节码包含了大量调试信息(如源类名/行号等)混淆代码就能删除这些调试信息&#xff0c;并用无意义字符替换所有名字&#xff0c;增加反编译难度&#xff01;ProGuard是一个混淆代码的开源项目&#xff0c;主要作用如下&#xff1a;混淆Obfuscate 用无…

前端学习(2334):angular之内置属性指令ngclass

child.html <p>child4 works!</p><div class"us">我是歌谣</div> <div [ngClass]"currentClass" class"col">我是歌谣</div>child.ts import { Component, OnInit } from angular/core;Component({select…

spring cloud consul整合

本文基于spring cloud Finchley.SR1 consul如何搭建可以看文章consul docker方式搭建 本文章源码位置&#xff1a;https://github.com/wanghongqi/springcloudconsul_test/ 目录 服务端 客户端 测试 服务端 pom.xml <properties><project.build.sourceEncodin…

event android,androidEvent 对 android 事件分发机制的一点个人理解,将事件机制进行了简单化处理,刚方便理解! @codeKK Android开源站...

android 中的事件处理一直以来困扰不少刚刚从事 android 开发的同学&#xff0c;网上也有不少讲解 android 事件分发的文章&#xff0c;然而讲解的都不够简洁&#xff01;现在我将用另一种简洁的方式来讲解 android 事件的分发机制&#xff01;android 的事件分发可以简单的归位…