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