struts2课堂笔记整理(第一天)_下午

struts2课堂笔记整理(第一天)_下午

=============================================================================================================

五、 Action的访问 ##

HTTP请求 提交 Struts2 StrutsPrepareAndExecuteFilter 核心控制器 —— 请求分发给不同Action

让请求能够访问Action —– Action书写方式 三种

  1. 第一种 Action可以是 POJO ((PlainOldJavaObjects)简单的Java对象) —- 不需要继承任何父类,实现任何接口

    * struts2框架 读取struts.xml 获得 完整Action类名 
    * obj = Class.forName("完整类名").newInstance();
    * Method m = Class.forName("完整类名").getMethod("execute");  m.invoke(obj); 通过反射 执行 execute方法
    
  2. 第二种 编写Action 实现Action接口

    Action接口中,定义默认五种 逻辑视图名称 
    public static final String SUCCESS = "success";  // 数据处理成功 (成功页面)
    public static final String NONE = "none";  // 页面不跳转  return null; 效果一样
    public static final String ERROR = "error";  // 数据处理发送错误 (错误页面)
    public static final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
    public static final String LOGIN = "login"; // 主要权限认证 (登陆页面)
    
    五种逻辑视图,解决Action处理数据后,跳转页面   
    
  3. 第三种 编写Action 继承ActionSupport (推荐)
    在Action中使用 表单校验、错误信息设置、读取国际化信息 三个功能

2、 Action中方法调用

  1. 在配置 元素时,没有指定method属性, 默认执行 Action类中 execute方法

    <action name="request1" class="cn.itcast.struts2.demo3.RequestAction1" />
    
  2. 在 元素内部 添加 method属性,指定执行Action中哪个方法

    <action name="regist" class="cn.itcast.struts2.demo4.RegistAction" method="regist"/> 执行 RegistAction 的regist方法
       * 将多个请求 业务方法 写入到一个Action 类中 
    <action name="addBook" class="cn.itcast.struts2.demo4.BookAction" method="addBook" ></action>
    <action name="delBook" class="cn.itcast.struts2.demo4.BookAction" method="delBook" ></action>   
    
  3. 使用通配符* ,简化struts.xml配置

    <a href="${pageContext.request.contextPath }/user/customer_add.action">添加客户</a>
    <a href="${pageContext.request.contextPath }/user/customer_del.action">删除客户</a>
    
    struts.xml
    <action name="customer_*" class="cn.itcast.struts2.demo4.CustomerAction" method="{1}"></action>   ---  {1}就是第一个* 匹配内容
    
    问:构造方法调用几次?是否为单例
    Action的生命周期?
    
    答:因为每次请求都会调用构造方法,说明它是多实例的,不存在线程并发访问时的冲突问题
    
    问:Struts1会不会存在线程安全问题?
    答:会存在线程并发访问时的安全问题
    
  4. 动态方法调用 (零配置路线)
    访问Action中指定方法,不进行配置

       1) 在工程中使用 动态方法调用 ,必须保证 struts.enable.DynamicMethodInvocation = true 常量值为true 
       2) 在action的访问路径 中 使用 "!方法名" 
        页面
        <a href="${pageContext.request.contextPath }/user/product!add.action">添加商品</a>
        配置
        <action name="product" class="cn.itcast.struts2.demo4.ProductAction"></action>
        执行 ProductAction 中的 add方法 
    

=============================================================================================================

六、在Action中使用Servlet API

1、 在Action 中解耦合方式 间接访问 Servlet API ——— 使用 ActionContext 对象在struts2 中 Action API 已经与 Servlet API 解耦合 (没有依赖关系 )

Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据

    actionContext = ActionContext.getContext();
  1. actionContext.getParameters(); 获得所有请求参数Map集合如:

    ActionContext context = ActionContext.getContext();
    String []no1 = (String[]) context.getParameters().get("no1");
    System.out.println("参数的值:"+no1[0]);
    
  2. 对request范围存取数据

    actionContext.put("company", "传智播客"); / actionContext.get("company")  
    
  3. actionContext.getSession(); 获得session数据Map,对Session范围存取数据

      actionContext.getSession().put("key","value");
    
  4. actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据

      actionContext.getApplication().put("key","value");
    

    本质分析是否存在线程安全问题? 不会有 答案原码:ActionContext (使用ThreadLocal存储相关的值)

2、 使用接口注入的方式,操作Servlet API (耦合)

ServletContextAware : 注入ServletContext对象
ServletRequestAware :注入 request对象
ServletResponseAware : 注入response对象

问:程序要使用哪个Servlet的对象,实现对应接口 
答:本质分析 
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

3、 在Action中直接通过 ServletActionContext 获得Servlet API

ServletActionContext.getRequest() : 获得request对象 (session)
ServletActionContext.getResponse() : 获得response 对象
ServletActionContext.getServletContext() : 获得ServletContext对象 

静态方法没有线程问题,ThreadLocal

=============================================================================================================

七、 结果页面的配置

Action处理请求后, 返回字符串(逻辑视图名), 需要在struts.xml 提供 元素定义结果页面

1. 局部结果页面 和 全局结果页面

    <action name="result" class="cn.itcast.struts2.demo6.ResultAction">
                <!-- 局部结果  当前Action使用 -->
                <result name="success">/demo6/result.jsp</result> 
    </action>

    <global-results>
                <!-- 全局结果 当前包中 所有Action都可以用-->
                <result name="success">/demo6/result.jsp</result>
    </global-results>

2、 结果页面跳转类型

* 在struts-default.xml 定义了 一些结果页面类型 
* 使用默认type 是 dispatcher 转发 (request.getRequestDispatcher.forward)

1)  dispatcher :Action 转发给 JSP
2)  chain :Action调用另一个Action (同一次请求)
    <result name="success" type="chain">hello</result>  hello是一个Action的name 
3) redirect : Action重定向到 JSP
     <result name="success" type="redirect">hello.action</result>  hello是一个Action的name 
4) redirectAction :Action重定向到另一个Action 
    <result name="success" type="redirectAction">hello</result> 

=============================================================================================================

八、 基于注解的struts2 开发 ##

1、 约定 struts2提供默认规则,实现零配置 ###

 1)导入jar包  12个jar  +  struts2-convention-plugin-2.3.7.jar 
 2)在web.xml 配置前端控制器 
 3)编写页面 
 4)插件中 plugin配置文件 
 <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>
 编写Action类,必须位于 action,actions,struts,struts2 四个包中 
 <constant name="struts.convention.action.suffix" value="Action"/>
 以Action结尾

**** <constant name="struts.convention.result.path" value="/WEB-INF/content/"/> 结果result页面存放位置
 Action被扫描后,如何确定Action的访问路径的 ? 
     cn.itcast.struts2.HelloAction  (HelloAction位于直接位于四个扫描包下,namespace是/,Action的name是hello) ---- /hello.action
     cn.itcast.actions.books.BookSearchAction (BookSearchAction 不是直接位于四个扫描包下,namespace是/books, Action的name是book-search)
        * 访问路径 /books/book-search.action
     cn.itcast.struts.user.UserAction 访问 /user/user.action
     cn.itcast.estore.action.test.LoginAction  访问 /test/login.action

  5) 根据常量配置 结果页面 位于 /WEB-INF/content下 
    页面命名规则约定: actionName + resultCode + suffix 
    例如: cn.itcast.struts.user.UserAction ------ /user/user.action 返回 SUCCESS 
         结果页面 /WEB-INF/content/user/user-success.jsp --- 找不到 /WEB-INF/content/user/user-success.html --- 找不到 /WEB-INF/content/user/user.jsp

2、 注解

注解开发第一步 基于约定的自动扫描

约定只解决Action访问和结果页面跳转问题

  • 在开发中需要为Action指定拦截器,进行更细节result配置
  • 约定不够灵活,注解的功能 是和 xml配置方式 等价的

    使用 @Action注解配置访问路径  @Result注解 配置结果页面 
    
    <constant name="struts.convention.classes.reload" value="false" /> Action类文件重新自动加载
    
    @ParentPackage 配置<package> extends 继承哪个包
    @Namespace  配置包名称空间 必须以/开头的命名空间
       例如:
       @Namespace("/employee")
    @ParentPackage("struts-default")
    public class HelloAnn extends ActionSupport {
    
        @Actions(value={@Action(value="myAnn1",results=@Result(name="success",location="/02ann.jsp")),
                @Action(value="helloAnn1",results=@Result(name="success",location="/02ann.jsp"))        
        })
        public String add() throws Exception {
            System.out.println("HelloAnn--------->add()执行了");
            return SUCCESS;
        }
    }
    

===========================================================================================================================================

struts2 第一天小结 内容 ##

1、 struts2 环境搭建 (导入jar包、web.xml、 struts.xml )
2、 struts2 运行流程 
3、 配置文件加载顺序 
4、 <package> <action> <result> 元素配置 
5、 Action书写三种方式
6、 指定method方法调用、通配符、动态方法调用 
7、 Action访问Servlet API 
8、 约定、注解 

登陆练习完成
    1.实现用户登录 
         login.jsp------------>action (DBUtils操作mysql数据库 ,如果正确,将用户信息存入到session中 )---->
         将结果显示到另一个result.jsp页面中,可以看到"欢迎您,aa用户"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱的叹息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值