利用项目来解析Struts 框架工作组件及其流程

Struts 框架

•定义:提供了一个 Web 开发的一个表示层架构,鼓励程序员用 MVC 设计模式 来开发项目 – 是一个表示层框架 / 开源 MVC 框架
•Model Ⅰ / Model Ⅱ:
○ModelⅠ [ JSP + JavaBean ]:
○Model Ⅱ
在这里插入图片描述

•Struts 框架的图形表示及流程
在这里插入图片描述

○用户通过浏览器发请求给 Tomcat,Tomcat 创建 request 内置对象接收请求并将请求交给 Struts

ActionServlet:即 Struts,中央控制器
○Struts 接收请求后分析请求,通过分析从 Struts-config.xml 中找到与该请求对应的配置信息

Struts-config.xml:Struts 的主配文件 – 可以知道整个项目的流程
○通过 配置信息找到与该请求对应的 ActionForm [ 表单Bean ],将与请求对应的参数封装并传递
○根据配置信息找到 Action,通过 Action 中相应的 execute() 方法调用模型层,将请求传给真正的业务对象和持久对象

Action:业务层前端控制器,由 Struts 进行创建
○请求被相应的业务层持久层传递处理后,Action 将结果Bean 封装进 request 内置对象并返回一个ActionForward 对象

ActionForward – Action 创建的一个封装了转向信息的对象,转向信息的封装依赖于该请求对应的配置信息中的 标签
○ActionServlet 根据 ActionForward 对象中封装的转向信息,转向给对应的 jsp 视图组件,jsp 拿到结果Bean 进行渲染并显示

Struts 项目环境的搭建

•用 Eclipse 创建一个 Web 项目
•导入 Struts 架包
○从 Struts 资源/lib 下的九个架包导入到自己的 Web 项目根下的 lib 中
•配置 Struts 1 – 配置 web.xml 文件
○从 Struts 资源/webapps/struts-blank/WEB-INF/web.xml 中直接获取相应的配置信息 – 任何一个用 struts 1 的项目的配置信息

<!-- 中央控制器 -->
<servlet>
<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- 主配文件,Tomcat 一启动就能拿到 -->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<!-- 错误日志,对出错的记录 -->
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<!-- 解析日志的记录 -->
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<!-- Tomcat 一启动就加载 -->
<load-on-startup>2</load-on-startup>
</servlet>

<!-- struts 1 只接受以 .do 结尾的请求 -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

•提供整个项目的 Struts-config.xml 文件 – 从 Struts 资源/webapps/struts-blank/WEB-INF/web.xml 中直接获取

•常用组件的创建
○index.jsp – 使用基本模板,不使用高级模板
○ActionForm.java – 表单Bean

继承 ActionForm 类
自己定义表单Bean 属性后,右键类名 - Source - 选择相应的 get / set 方法自动生成 / 复写 reset() 和 validate() 方法
○LoginAction.java – Action 中央处理器

继承 Action 类

右键类名 - Source - 选择复写 execute() 方法

第一个 Struts 项目

•浏览器发请求:http://127.0.0.1:8080/struts_login
•Tomcat 自动执行 index.jsp – 由于配置,此请求不会交给 struts 处理
○struts 只接受 .do 结尾的请求
•进入登录页面后输入用户名密码,表单提交一个 post 请求,action 为 login.do – Tomcat 创建 request 内置对象封装请求后提交给 struts 处理

<form action="login.do" method="post">
用户:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>

•struts 分析请求:http://127.0.0.1:8080/struts_login/login.do?username=“admin”&password=“admin”
○struts 从 request 中拿到请求字符串进行分析 – 从请求中只截取出 /login
○到 Struts-config.xml 配置文件中找名为 “/login” 的 标签 / action-mapping 对象 – 每个请求都有相应的配置文件 [ 标签 ]
// 此标签内封装多个请求对应的配置信息 [ 多个 标签 ]
<action path="/login" // 标识请求对应的配置信息的名字type=“com.struts.LoginAction” name=“loginForm”
scope=“request” // 一旦创建了表单Bean 对象,就将对象封装到 scope 对应的内置对象中 – 如果不配置 scope,默认为 session validate=“false” // 标识不调用表单Bean 的 valicate() 方法 – 如果不配置 validate,默认为 true,会对表单中的数据进行验证

<forward name="success" path="/login_success.jsp" redirect="false"/> // 此标签为了创建 ActionForward 对象
<forward name="error" path="/login_error.jsp"/> // redirect 不写默认为 false,即转向方式为请求转发
</action>

</action-mappings>

○在 标签中找 name 属性,通过 name 属性找有相同 name 属性的 标签,此标签属性中有 type 属性值为表单Bean
// type 标识 form-bean 的类型,即对应的 ActionForm 的类名

步骤

先看 scope 中有没有属性名为 loginForm 的属性值,如果没有通过反射机制创建表单Bean 对象 ActionForm [ 类似于 jsp 标签 ]
□自动创建表单Bean 对象,将表单Bean 对象放在 request 内置对象中,属性名为 loginForm [ name 属性的属性值 ]
□创建之后自动调用表单Bean 的 reset() 方法初始化
□初始化之后进行表单数据的自动收集 – Enumeration 自身迭代机制
□调用表单Bean 的 valicate() 方法对收集的数据进行验证
○根据 type 属性找到 Action 中央控制器对象 [ 单例 ]
通过 map 的一个单例:把 Action 对象的类名作为 key,Action 对象作为 value
先在 map 中看有没有 key 为 “LoginAction” 的值,没有就通过反射创建出 Action 对象 LoginAction
○自动执行 Action对象中的 execute() 方法,自动注入与该请求对应的配置信息的对象 ActionMapping / 表单Bean ActionForm / request / response
拿到注入的表单Bean 数据,从表单Bean 中拿到参数数据
通过单例方式拿到业务对象,调用 login() 方法并注入参数数据UserManager.getinstance().login( username, password);
为什么不直接传递表单Bean ActionForm,而是传递拿出后的参数数据
□ActionForm 依赖于 struts 框架,如果直接传递 ActionForm 给业务层,意味着业务层的 login 方法也变成了一个Bean 导致业务层也依赖于 struts 框架 – 如果更换框架,将要几乎重写所有代码,可移植性不好
为什么要注入 ActionMapping
□生成 ActionForward 对象依赖于 ActionMapping

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值