ch21struts1.x概述
第一章 struts基础

struts1.x——第一章框架技术概述1struts框架简介1.1经典MVC设计模式Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages 、Servlet、标签库以及面向对象的技术水准。
Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。
这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。
这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。
当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。
同样,软件工程师使用Struts为业务应用的每一层提供支持。
它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。
我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。
如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。
Struts对Model,View和Controller都提供了对应的组件。
ActionServlet,这个类是Struts的核心控制器,负责拦截来自用户的请求。
Action,这个类通常由用户提供,该控制器负责接收来自ActionServlet的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给JSP页面显示。
Model部分由JavaBean组成,ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionFrom里面的请求参数处理用户的请求。
JavaBean则封装了底层的业务逻辑,包括数据库访问等。
View部分该部分采用JSP实现。
Struts提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与Model的有效交互,并增加了现实功能。
Struts1.x

struts1.x一、开发struts1应用的基本步骤1)首先导入struts1的所有jar包;2)在WEB-INF下创建struts-config.xml这个核心配置文件;3)在web.xml文件中配置struts的主控器ActionServlet;注:以上三步可以通过MyEclipse插件自动完成4)创建一个ActionForm类,继承ActionForm(可选),在这个类中提供属性和getter/setter方法来获得客户端提交的参数值;5)创建一个Action类,继承Action。
在execute方法中编写处理请求的代码,处理完成后返回一个ActionForward对象给主控器。
注:ActionForword实际上是一个包含了视图路径和转发请求方式的一个对象,这个对象可以有两种创建方式:1.直接new一个,在创建的时候,通过构造器传入视图路径和转发请求方式等信息。
2.通过ActionMapping对象的findForward方法创建,这种方式实际上是在配置文件中配置转发请求的一些信息,然后根据这些信息创建一个ActionForward对象。
6)在struts-config.xml文件中配置Action;7)在jsp页面上指定发送请求的路径,必须以.do结尾。
二、Struts的工作流程***装载并实例化ActionServlet***当Web Server启动装载Web应用(基于Struts)时,容器先将ActionServlet装载进虚拟机并实例化,接着调用init()方法,在init()中ActionServlet去解析struts-config.xml文件,将其中的元素信息封装到相应的对象中,对象被存放到Struts框架维护的集合中。
例如:<form-bean>元素 --> ActionFormBean对象<action>元素 --> ActionMapping对象元素中的属性 --> 对象中的属性注: ActionFormBean和ActionMapping对象被存放在Struts框架维护的HashMap 中HashMap formbeans(name,ActionFormBean对象引用)HashMap actionconfigs(path,ActionMapping对象引用)init()方法调用完毕后,ActionServlet处于service状态,可以接受客户端的请求。
struts1教程

本系列教程将详细介绍Struts 1.x的基本原理和使用方法,读者可以参阅《Struts 2系列教程》来比较Struts 1.x和Struts 2.x的相同点和不同点。
在这篇文章中将以一个简单的例子(mystruts)来演示如何使用MyEclipse来开发、运行Struts程序,并给出了解决ActionForm出现乱码问题的方法。
读者可以从本文中了解开发Struts 1.x程序的基本过程。
一、本文给出的程序要实现什么功能mystruts是一个录入和查询产品信息的程序。
为了方便起见,本例中的产品信息表只包括了产品ID、产品名称和产品价格三个字段。
mystruts的主要功能如下:1. 接受用户输入的产品ID、产品名称和产品价格。
2. 验证这些字段的合法性。
如果某些字段的输入不合法(如未输入产品ID),程序会forward到一个信息显示页,并显示出错原因。
3. 如果用户输入了正确的字段值,程序会将这些字段值保存到数据库中,并显示“保存成功”信息。
4. 用户输入产品名称,并根据产品名称进行模糊查询。
如果存在符合要求的产品信息。
程序会以表格形式显示这些产品的信息,同时显示记录数。
如果未查到任何记录,会显示“没有符合要求的记录!”信息。
二、编写程序前的准备工作1. 建立数据库在编写程序之前,需要建立一个数据库(struts)和一个表(t_products),建立数据库和表的SQL脚本如下所示:# 建立数据库strutsCREATE DATABASE IF NOT EXISTS struts DEFAULT CHARACT ER SET GBK;# 建立表t_productsCREATE TABLE IF NOT EXISTS struts.t_products (product_id varchar(4) NOT NULL,product_name varchar(50) NOT NULL,price float NOT NULL,PRIMARY KEY (product_id)) ENGINE=InnoDB DEFAULT CHARSET=gbk;2 建立一个支持struts1.x的samples工程用MyEclipse建立一个samples工程(Web工程),现在这个samples 工程还不支持Struts1.x(没有引入相应的Struts jar包、struts-config.xml 文件以及其他和Struts相关的配置)。
Struts1

Struts1原理当用户发送一个HTTP请求时,该请求被ActionServlet(核心控制器)拦截,ActionServlet将该请求转发给对应的业务逻辑控制器,业务逻辑控制器调用模型来处理用户请求;如果用户请求只是希望得到某个URL资源,则由ActionServlet将被请求的资源转发给用户。
如果需要调用业务逻辑控制器处理用户请求,则调用业务处理器将处理结果通过JSP呈现给用户。
Struts 1.x的组件Model部分Struts 1.x的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库访问、业务逻辑方法实现。
对于一个成熟的企业应用而言,Model部分也不是一个简单的JavaBean所能完成的,它可能是一个或多个EJB组件,可能是一个WebService服务。
Model部分封装了整个应用的所有业务逻辑,但整个部分并不是由Struts 1.x提供的,Struts 1.x除了对ActionForm提供自动赋值之外,没有为实现Model组件提供其他支持。
View部分Struts 1.x的View部分采用JSP实现。
Struts 1.x提供了丰富的标签库,通过这些标签库可以最大限度地减少脚本的使用。
这些自定义的标签库可以输出控制器的处理结果。
虽然Struts 1.x提供了与Tiles框架的整合,但Struts 1.x所支持的表现层技术非常单一:既不支持FreeMarker、Velocity等模板技术,也不支持JasperReports等报表技术。
Controller部分Struts 1.x的Controller由两个部分组成。
系统核心控制器:由Struts 1.x框架提供,就是系统中的ActionServlet。
业务逻辑控制器:由Struts 1.x框架提供,就是用户自己实现的Action实例。
Struts 1.x的缺陷(Struts1的缺陷是相对于Struts2来说的)(1)与Servlet API严重耦合,难于测试因为Struts 1.x框架是在Model 2的基础上发展起来的,因此它完全是基于Servlet API 的,所以在Struts 1.x的业务逻辑控制器内,充满了大量的Servlet API。
Struts01

• Java 2 SDK SE • Servlet Container(Web Application Server)
• •
下载Struts的二进制发布版 将下载的Struts二进制发布版进行解包,将解包目录下的lib目录 下的所有.jar文件全部复制到后续创建的Web应用目录的WEBINF/lib目录下。如文件直接复制到Tomcat安装目录的common\lib目录下
1 新建项目 2 添加Struts相关的jar包 3 准备视图组件 4 定义javaBean组件 5 在web.xml文件中配置ActionServlet 6 创建struts-config.xml文件,增加配置 7 创建Action的子类组件 8 发布并运行
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 具体实现步骤
UserForm 负责接受视图组件中表 单所提交数据(注意:此 类中属性的名称必须与 页面表单中组件的name 属性的值相同)
• • • • • •
}
public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; }
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 具体实现步骤
5 在web.xml文件中配置ActionServlet
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet>
struts1工作原理

struts1工作原理
Struts 1是一个基于模型-视图-控制器(Model-View-Controller,MVC)架构的Web应用程序框架。
它的工作原理如下:
1. 请求分发:当用户发送一个HTTP请求时,Struts的控制器
组件(ActionServlet)接收并拦截这个请求。
2. 配置查找:ActionServlet查找配置文件struts-config.xml,该
文件定义了请求路径与对应的控制器以及其他配置信息。
3. 控制器执行:根据请求路径,ActionServlet实例化并执行对
应的控制器(Action)组件。
控制器处理请求参数和业务逻辑,并根据需要访问模型(Model)组件来获取、修改数据。
4. 视图生成:控制器完成处理后,将结果数据传递给视图(JSP页面)组件,用于生成动态的HTML响应。
5. 响应发送:视图生成完毕后,ActionServlet将响应返回给客
户端浏览器,完成整个请求-响应周期。
在这个工作过程中,Struts 1还提供了其他重要的组件和功能,如表单验证、国际化支持、异常处理等,以及许多预定义的标签库和工具类,帮助开发者更方便地构建和管理Web应用程序。
Struts1 原理及配置讲解附源码

Struts1原理及配置讲解附源码最近要看公司网站源码,源码都是用struts1写的,我们平时用的都是struts2,所以的对struts1不是很熟悉。
我也就是刚开始接触struts的时候对struts1有个简单的学习(搭建一个简单的项目,然后连接数据库做一些增删改查的操作还可以,但是具体的原理让我说我也说不上来),因此今天抽一部分时间把struts1的概念了解下和自己动手搭建一个项目使用struts1(就是一个简单的用户登录,居然可以跑起来,瞬间感觉对用struts1做一些简单功能还是可以做成的)。
废话不说了....首先介绍下struts1工作原理:1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。
(面向对象思想)2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。
3.form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。
4.派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。
5.处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。
服务器通过ActionForward对象进行转发工作。
6.返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。
7.查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。
Struts1简介和入门

Struts1简介和入门1. 框架框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。
也就是说框架是一个半成品的应用程序。
我们所面对的应用程序一般都是分为两部分,一部分是业务相关的组件部分,另一部分是和业务无关的组件部分。
而我们知道和业务相关的组件部分的重用性是非常低的,这也是显而易见的事情;而和业务无关的组件部分,如验证、异常、程序流程控制等等服务组件的复用性是非常高的。
所以当人们在不同的应用程序中抽出共性的组件,构成一个半成品应用程序,这时候框架就应运而生了。
2. Struts1框架什么是struts1框架?解答这个问题,就不得不看先前的三篇中的mvc设计模式实例,因为struts1框架是一个基于mvc的框架(如果弄懂那个实例,这里理解struts1框架是非常轻松的)。
Struts1框架结构如图:上面图展示了struts1框架的结构,从左到右,分别是V,C,M。
表示层主要由JSP和标签库组成。
所有通过struts1框架的请求都经过ActionServlet接受(这个类struts1框架已经给我封装好了),根据接收的请求参数和Struts配置(struts-config.xml)中ActionMapping,将请求送给合适的Action去处理,解决由谁做的问题,它们共同构成Struts的控制器。
Action则是Struts应用中真正干活的组件,开发人员一般都要在这里耗费大量的时间,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给客户。
虽然现在还没有实现一个struts1框架实例,但是我们有了先前mvc设计模式实例的基础,我们来看struts框架,我们发现我们先前的实例中的testservlet做了struts中的Actionservlet的事情;AddUserAction、DelUserAction、ModifyUserAction、QueryUserAciton做了struts中的Action事情,ActionForm做了struts中actionform的事情;actionmapping做了struts中actionmapping的事情;action_config.xml做了struts-config.xml的事情。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
web.xml中的配置-mystruts1
如果是使用servlet,在使用向导创建过程,已经添加了 <servlet> <servlet-name>Controller</servlet-name> <servletclass>org.sf.ssha.framework.Controller</servletclass> </servlet> <servlet-mapping> <servlet-name>Controller</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
实现加法器
基于框架开发:实现加法器
1、开发模型:Calculator类。 2、开发视图:页面add.jsp和页面 add_result.jsp。 3、创建Action接口 4、创建AddAction,实现Action 接口 5、开发Controller类,添加对 AddAction的支持。
6、web.xml中添加Servlet或过滤 器,指定自定义框架
系统
Java流行框架
大名鼎鼎的SSH
1、MVC设计模式的实现 2、接收用户请求,调用业务逻辑 代码,转发到正确页面 3、控制器 1、依赖注入容器 / AOP实现 2、声明式事务 3、简化Java EE应用 4、黏合剂,将大家组装到一起 1、ORM,简化数据库操作 2、DAO层
回顾:三层结构
三层结构指的是? 和.NET中三层结构的对比
add.jsp
<form name="calcForm" method="post" action="add.do"> <table border="1"> <tr> <td>第一个数:</td> <td><input type="text" name="num1"/></td> </tr> <tr> <td>第二个数:</td> <td><input type="text" name="num2"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value=" 加 "/> <input type="reset" value="重填"/> </td> </tr> </table> </form>
<filter-mapping> <filter-name>MyStrutsFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> 当然在其它的一些配置方面也有一些差别,请大家去分析 完成的程序项目mystruts1和mystruts2。
组件
框架
应用程序里可重用的“零 件”
一系列组件,按照一定的 结构组合在一起 作为系统开发的平台 实现完整功能的应用程序
空心钢管、铆钉 分页组件、控制器组件、视图组件
自行车车架 Struts、Spring、Hibernate、WebWork、 JSF、EJB DWR框架 自行车 物流管理系统、销售系统
小结
举例说明,什么是框架?
本门课程,我们将学习哪几个框架? Struts是做什么用的框架?
回顾:MVC设计模式
MVC的含义
M – Model(模型) –处理业务逻辑 V – View(视图) – 展现数据,获得用户输入 C – Controllor(控制器) – 接收用户输入,调用业务代码(M), 返回数据到视图(V)
这个框架还可以怎样改进?
自定义MVC框架的缺点
在增加功能时,需要修改Controller Servlet AddAction.java 的execute方法中直接引用页面物理路径, 修改 页面文件名时需要修改代码
使用框架的优点
这个框架给开发带来了什么好处?
JSP页面中没有业务逻辑代码,业务和展示彻底分开 用户操作抽象成了Action,程序逻辑更清晰 整个系统通过统一的入口(Controller Filter)访问
基于框架开发
如何基于这个框架开发用户登录功能? 需求描述:
输入用户名为“bzu”,密码为“bzu”则登录成功; 否则登录失败 登录成功转发到my.jsp,登录失败返回index.jsp继续登录
/** Controller类 * 根据路径判断Action的方法 * @param request * @return */ public void doPost(HttpServletRequest request, HttpServletResponse response) private MyAction determinActionByPath(HttpServletRequest throws ServletException, IOException { request) { MyAction ret=null; //得到action //得到请求路径,如: MyAction http://localhost:8080/mystruts1/add.do action=(MyAction)this.determinActionByPath(request); String path=request.getServletPath(); //调用action的execute方法 //从http://localhost:8080/mystruts1/add.do中取得add String resultView=action.execute(request, response); String //页面转向 actionName=path.substring(stIndexOf("/")+1,path.length()-3); if(null!=resultView){ //添加新功能时在这里添加 if("add".equals(actionName)){ request.getRequestDispatcher(resultView).forward(request, ret = new AddAction(); response); } } return ret; } }
add_result.jsp
<table border="1"> <tr> <td>第一个数:</td> <td>${param.num1}</td> </tr> <tr> <td>第二个数:</td> <td>${param.num2}</td> </tr> <tr> <td>计算结果:</td> <td>${requestScope.result}</td> </tr> </table>
演示示例: 基于自定义框架开发加法器
Calculator类
package ; //计算器业务类 public class Calculator { public double add(double a, double b){return a+b; } public double del(double a, double b){return a-b; } public double mul(double a, double b){return a*b; } public double div(double a, double b){ if(b!=0){ return a/b; } else{ return 0; } } }
是一个应用程序的半成品 提供可重用的公共结构 按一定规则组织的一组组件
优势:
不用再考虑公共问题 专心在业务实现上 பைடு நூலகம்构统一,易于学习、维护 新手也可写出好程序
直接组装汽车,不用自己造轮子 站在巨人的肩膀上,享用前人经验和智慧
概念辨析
技术、组件、框架和系统
概念 技术 说明 解决某一类问题的方法 举例 锻造技术 JSP技术、JDBC技术 XML技术、 JavaScript技术
三层结构在Java中的应用
分层原则
各层职责明确 上一层调下一层
层 数据访问层 / DAO层 职责 数据访问 JDBC/Hibernate
业务逻辑层 / BIZ层 / 服务层 / Service层
表示层 / WEB层 /表现层 /页面层
业务逻辑 普通Java类
与用户交互,获得 输入,展示输出 JSP/Taglib/Servlet /JavaScript/CSS
action接口MyAction.java
package org.sf.ssha.framework; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface MyAction { public String execute(HttpServletRequest request,HttpServletResponse response); }