Struts2
Struts2是一个非侵入性的框架
- struts2是什么
Struts2是一个基于MVC设计模式的web应用框架,他本质上相当于一个servlet,在MVC设计中,Struts2作为控制器(Contrller)来建立模型与视图的 数据交互,Struts2是Struts的下一代产品,是在Struts1和WebWork的技术上基础上进行了合并的全新的Struts2框架。其全新的Struts2的体系结构 与Struts1的结构差别巨大,Struts2亿WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI 完全脱离开,所以Struts2可以理解为WebWork的更新产品,虽然Struts1大Struts2有着太大的变化,但是相对于WebWork,Struts2变得很小
WEB层框架的特点(通用)------前端控制器模式
struts2-blank.war是struts2的核心jar包
- struts2的helloWord
- 新建工程
- 导入jar包(struts2-blank.war下边的全部包,先解压)
- 新建java类,实现action类。作用是--实现action接口后,执行我们自己写的java类是会自动 调用execute()方法,类似于post请求执行DoPost方法是一样的,返回的String类型是返回的 结果集
- 在web.xml中配置struts2的过滤器,用于接收请求
<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> |
- 在src下创建struts.xml文件,进行配置(在电脑没有联网的情况下配置struts.xml的的提示功能,找到catalog,user......,添加........)
<?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> <!--namespace="/" /表示hello.acction前面的/ --> <package name="default" extends="struts-default" namespace="/"> <!-- name="hello" hello表示对应请求路径中的hello.action,取出后缀名--> <action name="hello" class="cn.tedu.action.HelloAction"> <!-- name="success" 表示对应action中的返回值 --> <!-- /web/result.jsp 对应的跳转的页面 --> <result name="success">/web/result.jsp</result> </action> </package> </struts> |
- 部署项目,进行测试
- struts2的常用配置
核心配置文件(共两大类,六种)
- Struts.xml中节点的详解---面试知识点
在struts2中,当一个请求过来的时间,如果package的namespace和请求路径写的url不一致,他会去掉最后一集目录去匹配,如果最后没有匹配到,会去匹配namesapce的”/”,如果还是匹配不到,会去匹配namespace的””。
Namespace=”/”要比namespace=””的优先级要高
- action节点没有写class属性是什么结果
如果没有写class属性,会去执行actionspuort类的execute方法,此方法返回success
- 如果action节点的name属性值写错怎么办
配置默认的跳转页面
<!-- 告诉struts框架,如果找不到对应的action,跳转到指定的action,必须写在所有action的前面--> <default-action-ref name="errorpage"></default-action-ref> |
在package节点中配置一个单独的用来处理错误的action节点
<!-- 配置出错是要执行的action --> <action name="errorpage"> <result name="success">/web/errorpage.jsp</result> </action> |
- struts中的constant常量的配置(在struts.xml当中配置,一定要配置在package节点之前)
<!-- 常量的后缀名配置 --> <constant name="struts.action.extension" value="abc"></constant> |
- struts中的constant常量的配置(在web.xml中配置)
<init-param> <param-name>struts.action.extension</param-name> <param-value>xyz</param-value> </init-param> |
注意,如果在web.xml中配置了后缀名常量,那么在struts.xml中配置的后缀名常量就会不起作用,原因是当一个请求过来的时间先会去加载struts.xml文件,再去加载web.xml文件,当加载了web.xml文件之后,就会覆盖原来在struts.xml中配置的后缀名常量,一般推荐在struts.xml中配置后缀名常量
- 在struts中进行文件分离的配置,方便模块与模块之间的维护
在struts.xml核心配置文件当中引入外部的分离文件(适合多个模块之间的开发)
<struts> <!-- 表示引入了外部某一个模块的配置文件 --> <include file="struts-par1.xml"></include> </struts> |
- action的编写方式和访问方式(重点)
Action的编写方式---3种
- 实现action接口(可以使用结果集常量的字符串)
package cn.tedu.action;
import com.opensymphony.xwork2.Action;
public class HelloAction implements Action{
public String execute() throws Exception { return "success"; } } |
Action接口中5个常量和一个方法的详解
public static final String SUCCESS="success";---运行成功时返回的逻辑视图
public static final String NONE="none";----不返回任何的逻辑视图
public static final String ERROR="error";-----运行失败时返回的逻辑视图
public static final String INPUT="input";----效验失败时候返回的的逻辑视图
public static final String LOGIN="login";------登录时返回的逻辑视图
- 继承actionSupport类(推荐使用的方式)
- 对请求进行效验
- 设置错误的信息
- 读取国际化信息
继承了actionSupport类具有action接口的功能,因为actionSupport实现了action接口,还有验证 的功能
package cn.tedu.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction2 extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("继承ActionSupport执行了"); return super.execute(); } } |
3. pojo类(非侵入性,简单,干净),没有extends父类,也没有implements接口
package cn.tedu.action;
public class HelloAction3{ public String execute() { System.out.println("Action编写方式三"); return "success"; } } |
5.针对多个请求的struts.xml的配置(不同的请求执行不同的方法)
1.方式一:这种方式比较麻烦,一个请求要对应一个action的配置,如果请求很多会配置action会很浪费时间
<action name="hello3" class="cn.tedu.action.HelloAction3" method="login"> <result name="success">/web/result.jsp</result> </action> |
2.方式二:通配符的方式配置多个请求
<!-- 使用通配符方式配置多个请求执行的方法 name="hello3_*" *代表的就是方法名 如果这些写,url访问的写法就是: http://localhost:8080/struts2/hello3_login.xyz(caction) method="{1}" 表示通配符*的位置 示例:class="cn.tedu.action.{1}" 访问:HelloAction3_login --> <action name="hello3_*" class="cn.tedu.action.HelloAction3" method="{1}"> <result name="success">/web/result.jsp</result> </action> |
3.方式三:动态方法调用(这种方法不推荐使用,因为不安全)
<!-- 动态方法调用 如果这样写,不安全 访问方式为:比如访问登录的方法 userLogin!login.xyz http://localhost:8080/struts2/userLogin!login.xyz(caction) --> <action name="userLogin" class="cn.tedu.action.HelloAction3"> <result name="success">/web/result.jsp</result> </action> |
- struts2要拿到前台传来的数据,直接用servletActionContext对象,
里面有很多静态的方法可以直接拿到需要的对象,在做需要的操作,例如要拿到request对象,servletActionContext.getRequest();就直接拿到了请求对象
- struts2属性驱动接收请求参数
页面有多少个参数就要写多少个成员属相,也可以把成员属性放到一个javabean中
package cn.tedu.action.form;
import com.opensymphony.xwork2.ActionSupport;
public class FormAction extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("111111"); System.out.println(toString()); return NONE; } //通过struts2框架自动接收参数 private String username; private String pwd; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "FormAction [username=" + username + ", pwd=" + pwd + "]"; } } |
- struts2中result结果集的使用
- 局部结果集-----一个action对应一个result结果集,只对当前的action有效
<package name="default" extends="struts-default" namespace="/"> <action name="login" class="cn.tedu.action.form.FormAction"> <result name="success">/web/index.jap</result> </action> </package> |
- 全局结果集-----多个action对应一个result结果集,在action节点中不配置result节点结果集, 那么就会执行全局的结果集(注意:同名的局部结果集会覆盖全局的结果集,先走局部,如果局部 结果集不存在,再去走全局的结果集,如果全局的结果集不存在,就会报错)
<!-- global-results 必须配置在action节点前 --> <global-results> <result name="">global.jsp</result> </global-results> |
- 结果集类型----
作用:控制响应的方式(转发,重定向)
配置result节点元素时,name是逻辑视图名,type是结果集类型
Struts2提供的常用结果集都定义在struts-default.xml文件当中
演示转发和重定向的区别
Result节点的默认就是转发--转发
如果要在服务器中从一个action跳转到另外一个action,result节点的type属性为type=”chain”, type=”redirectAction”-------转发
只有result节点的type属性等于type=”redirect”的时间才会是转发
<action name="login" class="cn.tedu.action.form.FormAction"> <result name="success" type="redirect">/web/index.jap</result> </action> |
- struts2的文件的下载
- Struts2的参数效验方式
表单效验的两种方式
- 客户端效验:通过javaScript完成,(jquery validation插件),目的是过滤用户的一些操作失误
- 服务器效验:通过java代码完成,目的是整个应用阻止非法参数的重要防线、最后的防线
两者效验的特点:客户端效验,更加友好,用户可以第一时间告知数据输入有错误,(缺点是安全性较差)
服务器效验:更加安全效验机制,(考虑系统的健壮性,服务器效验建议要做)
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:fielderror></s:fielderror>:用于显示错误信息的struts2标签(放在jsp页面的某一个位置,就会把相对应的错误数据显示到此标签里面)
Struts2的两种校验范围:
- 全局校验(对当前action的所有方法进行校验)
手动全局效验参数(struts.xml中的配置)
<?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> <package name="" extends="struts-default" namespace="/"> <action name="user_*" class="" method="{1}"> <!-- input代表校验错误的时间要跳转的视图页面 --> <result name="input">视图页面名字</result> </action> </package> </struts> |
提交的action校验的逻辑代码(重写validate()方法,这种验证就是全局校验)
@Override public void validate() { //编写校验的逻辑代码,程序运行的时间会自动调用此方法进行校验 } |
- 局部校验(校验action中指定的方法,校验一个方法)
去掉@Override字样,还是写validate()方法,但是要在方法名后面加上盐校验的方法名称,方法名 称首字母大写
public void validate要校验的方法名,首字母大写() { //编写校验的逻辑代码,程序运行的时间会自动调用此方法进行校验,这种 //情况只对指定的方法进行校验,也就是局部校验 } |
注意:全局校验和局部校验两种校验方式不能同时对一个表单的数据进行校验