1.今日任务
1.struts2的工作流程
1.Struts2与MVC
概括地说,MVC思想将一个应用分成了Model,View,Control三个部分。三个部分以最少的耦合协同工作,从而提高应用的可扩展性和维护性。
MVC具有以下特点
多个视图对应一个模型
模型返回的数据与显示逻辑分离
三层架构导致的低耦合性和易维护性。
控制层概念。
MVC更符合软件工程化管理的精神
struts2中
Model对应业务逻辑组件,它通常用于实现业务逻辑方法 以及以及与底层数据库的交互等;
View对应视图组件,通常是指JSP页面,但也适用于其他视图显示技术, 如Velocity或者Excel文档;
Control对应系统核心控制器 和业务逻辑控制器
系统核心控制器为Struts2框架提供的FilterDispatcher, 它根据请求自动调用相应的Action。
而业务逻辑控制器是指开发人员自行定义的一系列Action, 在Action中负责调用相应的业务逻辑组件来完成处理。
2.Struts2体系架构
3.Struts2 框架由3个部分组成
核心控制器:FilterDispatcher
struts2框架的核心控制器,该控制器作为一个filter运行在web应用, 它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求
业务控制器
用户实现Action类的实例 Struts2的模型组件 JavaEE应用里的模型组件,通常指系统的业务逻辑组件,而隐藏在系统的业务逻辑组件下面的可能还包含Dao、领域对象等组件
业务控制器
Struts2能使用JSP、FreeMarker、Velocity等作为视图技术
4.Struts2工作流程
2.Action的使用
1.驱动方式
jsp-->action传递数据的传值
1.属性驱动
1.直接在action添加属性
注意要添加get和set方法
2.通过JavaBean的方式使用
action中声明JavaBean变量。同时添加Get和Set方法
表单中name属性中加变量名前缀
2.模型驱动
1.action实现ModelDriven,指定泛型
2.声明JavaBean的成员变量并实例化
3.重写getModel(),返回JavaBean的实例
模型驱动为主,属性驱动为辅,两者配合使用
2.Action的3种实现方式
1.简单的Java对象【POJO】
2.实现Action接口
5个常量
execute()方法
当没有指定要调用的方法的时 候会执行的
3.继承ActionSupport类
常用的方式
功能强大
实现了Action接口,支持验证框架,支持国际化
2.Action文件在配置文件中的配置方式
1.静态方式
1.直接在Action节点中通过method 属性制定调用的方法
<action name="userDelete" class="com.hd.controller.UserAction1" method="delete"> <result name="list" >/jsp/userlist.jsp</result> </action>
代码多,不方便,但可读性高
2.通配符方式
<action name="user_*" class="com.hd.controller.UserAction1" method="{1}"> <result name="list" >/jsp/userlist.jsp</result> <!-- 2.1版本没问题,2.5及以上统配符使用的方法被禁止到了1~2个,超过会报错,添加如下可避免 --> <allowed-methods>update,save,delete</allowed-methods> </action>
通配符从1开始--{ }
除了加<allowed>也可以在<action>中添加
<package name="myPack" extends="struts-default" namespace="/user" strict-method-invocation="false">
strict-method-invocation="false"
严格的方法访问
<action name="user_*_*" class="com.hd.controller.UserAction1" method="{1}"> <result name="list" >/jsp/{2}.jsp</result> </action>
2.动态方式
2.3以上版本要添加常量
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
strict-method-invocation="false" 同样要添加
<action name="user" class="com.hd.controller.UserAction1" > <result name="list" >/jsp/userlist.jsp</result> </action>
请求方式:http://.../user/user!save
!save
不太推荐,和通配符有点类似,!的方式容易被黑客利用,看懂别人的代码
推荐使用通配符的方式使用
3.验证框架
1.客户端校验
可以绕过客户端跳转
地址栏中直接输入JavaScript:myForm.submit()
不安全
代码在客户端执行,降低了服务器的压力
2.服务端校验
1.编程式验证
1.要继承ActionSupport
2.重写validate方法
该方法会在action业务方法之前调用该方法
@Override public void validate() { if(user.getUsername() == null || "".equals(user.getUsername())){ System.out.println("用户名不能为空"); // 阻断继续提交 返回一个 input 对应action中的input的跳转页面 this.addActionError("用户名不能为空"); this.addFieldError("msg", "用户名不能为空"); } }
<result name="input">/jsp/userlist.jsp</result>
3.让特定方法跳过validate方法验证
1.注解
@SkipValidation public String delete(){ System.out.println("delete"); return "list"; }
2.修改validate方法的名称
public void validateSave() { if(user.getUsername() == null || "".equals(user.getUsername())){ System.out.println("用户名不能为空"); // 阻断继续提交 返回一个 input 对应action中的input的跳转页面 this.addActionError("用户名不能为空"); this.addFieldError("msg", "用户名不能为空"); } }
只会验证save方法
要校验多个方法,就写多个validateXxx方法
4.JSP页面获取校验信息
<%@ taglib uri="/struts-tags" prefix="s" %>
this.addActionError("用户名不能为空");
<s:actionerror/>
this.addFieldError("msg", "用户名不能为空");
<s:fielderror fieldName="username"></s:fielderror>
2.配置文件验证
1.添加需要验证的配置文件
命名规则:Action类名+'-validation'
2.拷贝对应的dtd代码
3.验证每个字段
1.验证的类型
2.验证例子
3.验证特定方法
1.注解:指定不需要验证的方法
2.修改配置文件的名称
struts.xml文件中action中的name
4.Action中获取Web对象的方式
1.非IOC方式
直接方式
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext application = request.getServletContext();
间接方式
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
Map<String, Object> application = context.getApplication();
间接方法:只能用来存取值
2.IOC方式
IOC:控制反转
把实例化过程交给系统去处理
实现步骤
1.实现对应的接口
HttpServletRequest-->ServletRequestAware
ServletContext --> ServletContextAware
2.声明对应的成员变量
3.实现接口对象的方法,并赋值
注意:session是通过request获取的
5.OGNL表达式的使用
1.表达式语言
比EL表达式更强大
支持对象方法的调用
支持类静态方法的调用和值的访问
支持赋值操作和表达式串联
访问OGNL上下午和ActionContext
操作集合对象
必须和struts标签一起使用
2.从三大作用域中取值
3.放在值栈中的值不需要加#
1.什么值放在值栈中?
在Action中定义的属性保存在值栈中
2.值栈存储数据的特点
模型驱动的数据放在值栈的顶部
3.查找的顺序,
自上而下查找
<s:debug></s:debug>
4.调用方法
<s:property value="say()"/>
5.静态方法的调用
注意:静态方法的调用必须设置常量
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
6.投影和选择(集合操作)
2.作业
3.面试题
1.struts2是如何体现MVC的
2.struts2的工作流程
Loading...