struts2第一章-基本用法
一.struts简介
1.回顾
MVC
M-model模型层
V-view 视图层 前端界面
C-controller 控制层
struts2:
Apache提供的开源的控制层框架,相当于servlet
2.简介
struts2框架是Apache一个免费开源的基于MVC设计模式的web应用框架;本质上相当于一个servlet,在MVC设计模式中,struts2作为控制器(controller)来建立模型和视图的数据交互
3.历史
最开始的框架是struts1,非常流行,后来发现struts有许多缺陷;
在webwork框架基础上升级 成为struts2
14/15年,struts2出现高危漏洞,建议采用struts2.3.15版本以上;
4.优缺点:
优点:
(1)实现MVC模式,层次结构比较清晰,程序员只需要关注业务逻辑的实现
(2)丰富的标签库,大大提供开发效率(扯淡)
(3) struts2提供丰富的拦截器实现(重点)
(4)通过配置文件,就可以掌握整个系统的各个部分之间的关系
(5)异常处理机制,只需要在配置文件中进行相关异常处理,就可以对异常进行处理
(6)struts2可扩展性比较高,所有的设置都可以在配置文件中实现
(7)面向切面编程的思想在struts2有很好的体现,就是拦截器
缺点:
(1)跳转到页面时,需要配置页面路径(繁琐)
(2)数据类型转换,默认把所有提交的数据当做String类型,提交的数据复杂时需要我们自己提供类型转换器
二.struts2入门
使用的struts2版本:2.3.3.GA
1.下载:
https://archive.apache.org/dist/struts/
2.步骤:
(1)解压

(2)复制jar到自己web项目的lib中

(3)复制filter
把下图中web.xml中的filter配置复制到自己项目的web.xml中

<!-- 过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- /*:表示过滤所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
(4)复制struts.xml文件
把此文件复制到自己项目的src目录中

然后修改自己的struts.xml
<struts>
<!-- 常量配置 -->
<!-- 动态方法调用:true-开启,false-不开启 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 是否开启调试模式:true-是,false-否 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="helloAction" class="com.yujun.action.HelloAction">
<result>/hello.jsp</result>
</action>
</package>
</struts>
6)页面
hello.jsp

index.jsp

三、struts2注意事项
web.xml过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这是struts2的核心过滤器,接收前端的请求,把请求交给对应的action进行处理
struts2.0-2.1.2版本 : FilterDispatcher
struts2.1.3版本开始:StrutsPrepareAndExecuteFilter
2.方法的调用
请求struts2的action时,默认调用action类中的executr()方法: 若要修改默认的方法,需要在struts.xml中action节点中配置method属性

3.方法返回值
在请求struts2的action方法时,默认返回值是"success";若要修改默认的返回值,
需要在struts.xml中的result中的name属性

4.action类
通常我们自己定义action类,需要继承ActionSupport
这个父类提供了常有的常量方法
四、struts2执行流程

(1)客户端初始化一个指向Servlet容器(例如Tomcat)的请求 (客户端提交一个HttpServletRequest请求。)
(2)请求被提交到一系列的过滤器(Filter)。
如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。
FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。
(3)FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
(4) ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。
(5)ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。
(6)Action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
五、动态调用action方法
struts2执行action方法时,默认执行execute方法,对于开发不方便虽然可以在struts.xml中配置默认的方法,但是还是有缺陷,只能执行一个方法;
解决方案:
1.方法的动态调用
2.使用通配符
1、动态使用
(1)需要在struts.xml中开启动态方法
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
(2)语法:
actionName!方法名 或 actionName!方法名.action
案例
public class Demo2Action extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("Demo2Action...execute...");
return SUCCESS;
}
public String m1(){
System.out.println("Demo2Action...m1...");
return SUCCESS;
}
public String m2(){
System.out.println("Demo2Action...m2...");
return SUCCESS;
}
public String m3(){
System.out.println("Demo2Action...m3...");
return SUCCESS;
}
}
Demo2Action
<action name="demo2Action" class="com.yujun.maven.action.Demo2Action">
<result>/demo2.jsp</result>
</action>
struts.xml
<h3><a href="demo2Action">访问demo2Action中的execute方法</a></h3>
<h3><a href="demo2Action!execute">访问demo2Action中的execute方法</a></h3>
<h3><a href="demo2Action!execute.action">访问demo2Action中的execute方法</a></h3> <h3><a href="demo2Action!m1">访问demo2Action中的m1方法</a></h3>
<h3><a href="demo2Action!m2">访问demo2Action中的m2方法</a></h3>
<h3><a href="demo2Action!m3">访问demo2Action中的m3方法</a></h3>
index.jsp
2.通配符
使用"*"
<action name="demo2Action_*" class="com.yujun.maven.action.Demo2Action" method="{1}">
<result>/demo2.jsp</result>
</action>
<h3><a href="demo2Action_m2">访问demo2Action中的m2方法</a></h3>
<h3><a href="demo2Action_m3">访问demo2Action中的m3方法</a></h3>
案例
六、提交表单数据到action
使用成员变量
注意:
(1) action类中成员变量名称必须和表单中元素name一样
(2) action类中成员变量必须有set和get方法,利用反射来访问成员变量
(3) action类中成员变量名称前两个字母必须小写开头
1、表单页面



2、action类
@Getter
@Setter
public class Demo3Action extends ActionSupport {
private String username;
private int age; public String add(){
System.out.println("姓名:"+username+",年龄:"+age); return SUCCESS;
} }
3、struts.xml配置
<action name="demo3Action" class="com.yujun.maven.action.Demo3Action">
<result>/demo3_success.jsp</result>
</action>
4、成功页面
<h3>
姓名:${username },年龄:${age }
</h3>
七、封装表单数据
前面我们实现了表单数据的提交,在action类中进行获取数据;
如果表单的字段很多(20个),action类中声名对应个数的成员变量,action类代码会显得臃肿,怎么解决?
解决方案:
把表单中的数据字段进行封装,封装对象,然后在action类中使用对象访问即可;
注意:
(1) 对象的实体类中每个成员变量需要有公共的set和get方法
(2) action类中的对象属性必须有公共的set和get方法
1、表单页面

2、实体类
@Setter
@Getter
//@ToString
public class User {
private String username;
private int age; @Override
public String toString() {
return "User[usernmae="+username+",age="+age+"]";
}
}
3、action类
@Getter
@Setter
public class Demo4Action extends ActionSupport { private User user; public String add(){
System.out.println(user);
return SUCCESS;
}
}
4、成功页面
h3>
姓名:${user.username },年龄:${user.age }
</h3>
5、struts.xml配置
<action name="demo4Action" class="com.yujun.maven.action.Demo4Action">
<result>/demo4_success.jsp</result>
</action>
struts2第一章-基本用法的更多相关文章
- 【SSH三框架】Struts2第一章的基础:第一次写Struts2规划
今年八月,当已经SSH三架完成学业.然后,他感动Android开展.三个框架已经很长的时间做无用的东西.所以,如果你想花三四天的时间来复习一下,写在博客. 附带SSH整个jar包网盘下载:http:/ ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- Stealth视频教程学习笔记(第一章)
Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- SpringMVC从入门到精通之第一章
第一节 简介:SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需通过中间整合层进行整合.SpringMVC是基于MVC的WEB框架.MVC设计模式在B/S下的应用: ...
- 《css3实战》读书笔记 第一章 基于CSS需求而编写的HTML.
笔记说明 <CSS3实战手册第3版(影印版)>可以消除Web设计工作的痛苦,并且带给你:HTML--重新入门.如果你是HTML新手,你会学到如何以CSS友好的方式进行基本页面构造.若你是H ...
- Upgrading to Java 8——第一章 Lambda表达式
第一章 Lambda表达式 Lamada 表达式是Java SE 8中最重要的新特性,长期以来被认为是在Java中缺失的特性,它的出现使整个java 语言变得完整.至少到目前,在这节中你将学习到什么是 ...
- CSS3秘笈复习:第一章&第二章&第三章
第一章: 1.<cite>标签不仅可以将网页设置为斜体,还能给标题做上标记,使它便于被搜索引擎搜索到. 第二章: 1.import指令链接样式表: CSS本身有一种添加外部样式的方法:@i ...
- 《跟我学Shiro》学习笔记 第一章:Shiro简介
前言 现在在学习Shiro,参照着张开涛老师的博客进行学习,然后自己写博客记录一下学习中的知识点,一来可以加深理解,二来以后遗忘了可以查阅.没有学习过Shiro的小伙伴,也可以和我一起学习,大家共同进 ...
- Python3-Cookbook总结 - 第一章:数据结构和算法
第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. ...
随机推荐
- 前端js日期时间格式转换
前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示. 下面是分享一些不同格式的日期转换函数方法. /** * 时间戳转时间 * @param {S ...
- 最小生成树——Prim算法和Kruskal算法
洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...
- webp图片技术调研最终结论(完全真实数据可自行分析)
关于webp图片格式调研及测试 资料收集 什么是 WebP? WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩 ...
- spring 中的设计模式
https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485205&idx=1&sn=63455d2313776d ...
- python13 1.函数的嵌套定义 2.global、nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器
## 复习 '''1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() =&g ...
- 使用Docker构建nginx容器,并且启动后不会自动退出
为什么docker运行后就自动退出? docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器 ...
- Apache Hadoop 2.9.2 的归档案例剖析
Apache Hadoop 2.9.2 的归档案例剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章说明你对NameNode 工作原理是有深入的理解啦!我们知道 ...
- [面试]Actor模型
Actor模型 面试中自己说话不利落, 或者自己对知识点认识不全面.在这里进行一下记录. 理论部分都是收集(copy)自网上其他的博客. 什么是Actor模型 参与者模式(英语:Actor model ...
- 保护代理模式-Access Proxy(Java实现)
保护代理模式-Access Proxy 保护代理模式(Access Proxy), 也叫Protect Proxy. 这种代理用于对真实对象的功能做一些访问限制, 在代理层做身份验证. 通过了验证, ...
- HDU 2717(* bfs)
题意是在一个数轴上,每次可以一步到达当前位置数值的 2 倍的位置或者数值 +1 或数值 -1 的位置,给定 n 和 k,问从数值为 n 的位置最少多少步可以到达数值为 k 的位置. 用广搜的方法,把已 ...