Java Web设计实用教程 主 编:孔 昊 副主编:卢 霞 机械工业出版社
知 识 点 实例介绍 Struts框架结构 用Struts设计实例 利用Struts实现“班级事务发布”模块
6.1 实例介绍 一、演示教材中的案例,明确执行过程 一个应用背景:假设用户在客户端完成关于图书信 息的录入,服务器端获取信息后给客户一个反馈,以新 的页面显示客户录入的图书信息。
实例介绍 二、制作并分析项目结构 按照MVC的处理方式实现这个过程: 视图部分仅为两个JSP页面,一个用于录入信息,一个用于显示信息; 控制器部分用来从录入界面接收数据,存储到内置对象里并交给视图页面显示即可; 由于数据较少,模型部分甚至没有必要去设计。
实例介绍 三、Struts实现实例的要点分析 明确Struts的结构和实现策略。 急需解决的设计任务: 现在要借助Struts框架实现这个过程,实际上还是围绕 MVC中的三个模块进行设计,只是要明确Struts架构与MVC各 模块的对应关系。 急需解决的设计任务: 明确Struts的结构和实现策略。
6.2 Struts框架结构 一、Struts的工作流程
Struts框架结构 图中反映出的概念: 控制器:用于接收客户端发来的请求,按照struts-congfig.xml文件中的配置分配工作。 逻辑处理单元:用客户端的请求数据初始化表单属性,即实例化表单数据,再根据事务逻辑完成具体的处理工作。 数据模型:泛指用于存储或处理数据的Bean,但这里特指Struts中用来存储客户端请求数据的Bean,即ActionForm类。 视图URL:当处理单元完成任务后,会给控制器返回一个ActionForward对象,控制器就能根据它找到对应视图的URL,将结果返回给客户端浏览器。
Struts框架结构 二、一个工作要点——控制器的工作方式 与前面所讲的MVC设计不同的是:控制器有且仅有一个,归Struts Web所共有;当不同的请求到达时,由这个控制器再把任务分配给具体的业务处理单元,所以业务单元是多个且具有针对性的。在后面的设计中,处理任务转移到了对逻辑处理单元的设计而不是对控制器的设计。
Struts框架结构 三、编程要点——Struts的组件结构 ⑴ 基本组件包 :查看教材讲解 ⑵ 几个重要的核心类: ActionServlet:继承于 javax.servlet.http.HttpServlet类,在Struts中扮演控制器的角色。它可以根据配置文件的描述将任务提交到适当的处理器,在web.xml文件中可以看到对它的声明。
Struts框架结构 Action:协助ActionServlet完成业务操作,实现了请求与业务逻辑的分离。通常的做法是:定义用户类继承于Action类,重写这个类的execute()方法,在execute()方法中编程完成处理逻辑。struts-config.xml配置文件对项目中所有的Action组件进行了描述,供控制器ActionServlet进行选择和任务分配。
Struts框架结构 ActionForm:其主要功能是为Action的操作提供与客户表单相映射的数据。通常的做法是:定义用户类继承于ActionForm类,以Bean的形式定义客户端所提交的各种数据。设计Action的时候,往往将它与某个ActionForm对象关联起来,以便通过getXXX()方法提取用户数据。设计者还可以重写其validate()方法以便对用户数据进行校验。
Struts框架结构 ActionMapping:代表当前Action的配置信息。该对象是Struts依据配置文件创建的,其各个属性在struts-config.xml文件中进行配置。 ActionForward:对应URL地址,其它组件可以通过ActionForward的名称找到其对应的URL地址,并把控制转移到该URL。
6.3用Struts设计实例 一、建立普通的Web项目,为项目添加Struts支持
用Struts设计实例 添加Struts支持后所做的工作: ⑴ 展开Struts 1.2 Libraries目录查看Struts的包结构,与Struts的组件结构进行对照 ⑵ 查看web.xml文件,明确下面的问题: <servlet>元素定义了Servlet实例—一个名为action的Servlet。其中有一项比较重要的初始化参数config,指明了Struts的配置文件的名称和所在的位置; <servlet-mapping>元素建立Servlet映射。这个Servlet处理的是URL以.do为结尾的用户请求。
用Struts设计实例 web.xml文件体现的处理意义: 凡是以“*.do”形式发送到Web项目中的请求,全部调用action所代表的ActionServlet处理,所以我们把ActionServlet称为Struts中的控制器。
用Struts设计实例 ⑶ 查看struts-config.xml文件。 <?xml version="1.0" encoding="UTF-8"?> <struts-config> <data-sources /> <form-beans /> <global-exceptions /> <global-forwards /> <action-mappings /> <message-resources parameter="struts.ApplicationResources" /> </struts-config> 此时的配置信息还没有生成,随着Struts其他核心组件的创建,这些配置会随之变化。
用Struts设计实例 二、建立Struts核心组件—JSP页面
用Struts设计实例 建立JSP组件后所做的工作: ⑴ 查看项目结构和struts-config.xml文件(尤其Design方式) input.jsp文件: 关键点:① 形成符合要求的界面形式; ② 在提交表单时,action参数的设置值是“input.do”。 display.jsp文件: 关键点:通过request对象取出要显示的数据。
用Struts设计实例 三、建立Struts核心组件—ActionForm
用Struts设计实例 设计窗口中参数的含义: Name:ActionForm bean实例的名称,Action组件会初始化该实例,用于接收客户端录入的图书信息。 Form type:ActionForm组件的类名。图中将类存放在form包里,便于管理和维护。 Optional Details:用于设置ActionForm类的细节,比如该类中需要定义的各个属性。关于图书的信息有三个:图书类型、书名和作者,所以ActionForm bean中应该有三个属性对应这三个信息。
用Struts设计实例 建立ActionForm组件后所做的工作: ⑴ 查看struts-config.xml文件,分析<form-beans>元素的定义 ⑵ 查看InputActionForm.java文件的内容,分析bean的设计结构,明确它的作用和意义: Action对象通过这个类的实例获取表单中关于图书类别、书名和作者的数据。 reset()方法的重置作用和validate()方法的数据验证作用。
用Struts设计实例 四、建立Struts核心组件—Action
用Struts设计实例 Action组件的工作流程: ⑴ 接受控制器的调遣:当客户端提交了图书信息后,ActionServlet也需要将具体的任务交给一个指定的Action组件; ⑵ Action组件会通过ActionForm组件对象获取图书信息(没有Form对象时,会自动创建并初始化) ⑶ 在特定的方法中<execute()方法>,让用户编程完成具体的处理。
用Struts设计实例 设计窗口中参数的含义: Path:请求路径,以“/”开头,但不包括“*.do”后缀。与视图中的请求相对应。图中的情况说明:凡是以“input.do”发出的请求均由这个Action组件来处理。 Type:要建立的Action类的类名,这里起名为InputAction,同时又把它放在action包里。 Optional Details:配置Action组件类的各个细节,如:Form bean、参数、方法、Forwards组件、异常等。
用Struts设计实例 FormBean选项卡的设计: Name:ActionForm组件的对象名,体现了ActionForm组件与Action组件的绑定关系。Action组件会通过它接收向本Action发送的关于图书信息的表单数据。当输入不方便时,可以通过点击“Browse”按钮,选择已经声明了的Form bean对象。 Scope:ActionForm Bean的有效使用范围。 Input Source:指向一个视图。当执行了ActionForm的validate()方法时,如果返回了错误信息,那么Struts将会返回到这个input属性所指定的页面中。
用Struts设计实例 五、建立Struts核心组件—Forward 局部Forward组件的创建
用Struts设计实例 设计窗口中参数的含义: Name:Forward组件的名称,即要转发的名称,这里为result,设计者可以根据见名之意的原则起名。 Path:转发的目的页面,可以通过“Browse”选择前面已经建立好的display.jsp页面。 这样就建立了针对InputAction这个组件的跳转功能:Action组件 可以依据Forward的名称(result)将ActionForward对象返回到Servlet 中,控制器根据ActionForward的名称找到其对应的URL地址 (display.jsp的URL值),并把控制转移到该URL。
用Struts设计实例 六、观察结果,补充代码 ⑴ Struts项目的结构基本上完整了,发生的变化主要有两个: 在src目录下生成了action包,里面存放着Action组件对应的类文件 InputAction.java; 在struts-config.xml文件的视图显示区可以看到各组件的关系图。
用Struts设计实例 <action-mappings > <action attribute="inputForm" ⑵ struts-config.xml文件的内容变化 <action-mappings > <action attribute="inputForm" input="/input.jsp" name="inputForm" path="/input" scope="request" type="action.InputAction"> <forward name="result" path="/display.jsp" /> </action> </action-mappings>
用Struts设计实例 ⑶ 补充InputAction.java文件的代码 public ActionForward execute(mapping, form, request, response)throws IOException { InputAcionForm inputForm = (InputAcionForm) form; String bookType=inputForm.getBookType(); String bookName=inputForm.getBookName(); String bookAuthor=inputForm.getBookAuthor(); request.setAttribute("bookType", bookType); request.setAttribute("bookName", bookName); request.setAttribute("bookAuthor", bookAuthor); return mapping.findForward("result"); }
用Struts设计实例 ① 通过Form类中定义的getXXX()方法获取表单中的图书信息 ② 将信息存储到request对象里,存储的关键字名称与display.jsp文件相呼应 ③ 依据Forward组件的名称(result),返回到Servlet中
6.4 利用Struts实现“班级事务发布”模块 一、准备项目结构 ⑴ 明确设计要素
利用Struts实现“班级事务发布”模块 ⑵ 准备工作 建立一个普通的Web项目,添加Struts支持,使其成为Struts项目,同时配置构建路径中关于MySQL的库文件; 将上面所提到的使用资源复制到这个项目的恰当位置。 准备工作结束后的项目结构
利用Struts实现“班级事务发布”模块 二、 获取事务分类信息的设计 ⑴ 设计组件
利用Struts实现“班级事务发布”模块 要点说明: Path:接收“getsort.do”形式的请求,所以把left.jsp文件中关于“班级事务发布”的超级链接代码改为—<a href="getsort.do">。 Type:在action包中,增加了SortListAction类,用于Action组件设计逻辑处理代码。 Form选项卡:只配置了Input Source细节,使其指向left.jsp页面。 Forwards选项卡:Action组件得到分类信息后,通过“input”名称跳转到信息的录入界面。
利用Struts实现“班级事务发布”模块 设计好组件之后,struts-config.xml文件的代码如下: <action-mappings > <action input="/left.jsp" path="/getsort" type="action.SortListAction"> <forward name="input" path="/affairs_add.jsp" /> </action> </action-mappings>
利用Struts实现“班级事务发布”模块 ⑵ 编写代码 编写Action组件中关于分类信息的获取代码 SortListAction.java文件的代码如下: public ActionForward execute(mapping, form, request, response) { SortHandle handle=new SortHandle(); List<Sort> list=handle.getSorts(); request.setAttribute("sortList", list); return mapping.findForward("input"); }
利用Struts实现“班级事务发布”模块 三、班级事务发布的设计 ⑴ 设计组件 ActionForm组件的设计: Form Properties选项卡中三个属性的设置一定要与视图中的表单数据一一对应。
利用Struts实现“班级事务发布”模块 Action组件和Forward组件的设计细节
利用Struts实现“班级事务发布”模块 struts-config.xml文件中关于<action-mappings>元素的代码: <action-mappings > <action input="/left.jsp" path="/getsort" type="action.SortListAction"> <forward name="input" path="/affairs_add.jsp" /> </action> attribute="inputForm" input="/affairs_add.jsp" name="inputForm" path="/affairsAdd" scope="request" type="action.AffairsAddAction"> <forward name="result" path="/result.jsp" /> </action-mappings>
利用Struts实现“班级事务发布”模块 ⑵ 编写代码 在Action组件中设计代码(AffairsAddAction.java文件) 代码通过form对象初始化了inputForm实例,随后调用getXXX()方法获取表单中的信息,并为affair对象准备好所有数据后(包括编码处理),经过处理Bean完成了数据存储,最后经过Forward组件完成结果视图的调用。
本章课程结束,谢谢!