struts2课堂笔记整理(第一天)_下午
=============================================================================================================
五、 Action的访问 ##
HTTP请求 提交 Struts2 StrutsPrepareAndExecuteFilter 核心控制器 —— 请求分发给不同Action
让请求能够访问Action —– Action书写方式 三种
第一种 Action可以是 POJO ((PlainOldJavaObjects)简单的Java对象) —- 不需要继承任何父类,实现任何接口
* struts2框架 读取struts.xml 获得 完整Action类名 * obj = Class.forName("完整类名").newInstance(); * Method m = Class.forName("完整类名").getMethod("execute"); m.invoke(obj); 通过反射 执行 execute方法
第二种 编写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处理数据后,跳转页面
第三种 编写Action 继承ActionSupport (推荐)
在Action中使用 表单校验、错误信息设置、读取国际化信息 三个功能
2、 Action中方法调用
在配置 元素时,没有指定method属性, 默认执行 Action类中 execute方法
<action name="request1" class="cn.itcast.struts2.demo3.RequestAction1" />
在 元素内部 添加 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>
使用通配符* ,简化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会不会存在线程安全问题? 答:会存在线程并发访问时的安全问题
动态方法调用 (零配置路线)
访问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();
actionContext.getParameters(); 获得所有请求参数Map集合如:
ActionContext context = ActionContext.getContext(); String []no1 = (String[]) context.getParameters().get("no1"); System.out.println("参数的值:"+no1[0]);
对request范围存取数据
actionContext.put("company", "传智播客"); / actionContext.get("company")
actionContext.getSession(); 获得session数据Map,对Session范围存取数据
actionContext.getSession().put("key","value");
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用户"