JavaEE架构与程序设计--第三部分
- 格式:ppt
- 大小:1.27 MB
- 文档页数:74


javaEE常⽤开源框架的认识及概述对javaEE框架的认识⼀、什么是框架通俗的理解,框架是我们软件开发中的⼀套解决⽅案,不同的框架解决的问题是不同的,⽐如MyBatis框架解决的是持久层的问题,springMVC框架解决的是表现层的问题。
需要注意的是,框架它本⾝⾃⼰是不能实现业务上的功能,它只能对,⽐如说持久层、表现层、结构合理性等等,提供⼀些解决⽅案,⽽真正的业务层部分,还需要程序员⾃⼰来提供。
所以说,框架可以理解为⼀个半成品,我们选⽤这个半成品,然后加上业务需求(即项⽬中的需求)来最终实现整个的功能。
⽽我们使⽤框架的⽬的其实也很简单,就是为了提⾼开发的效率,⽽不⽤关⼼⼀些繁琐的、复杂的底层代码实现,从⽽把更多的精⼒⽤在需求的实现上。
⼆、框架能帮我们解决哪些问题要明⽩框架能解决哪些问题,⾸先要知道三层架构。
三层架构分为三层:表现层:是⽤于展⽰数据的;业务层:是处理业务需求的;持久层:是和数据库交互的。
从这张图可看出上⾯列出的三个框架和三层架构所处的位置。
可以看出MyBatis框架是⼀个持久层框架,它是和数据库交互的;⽽下⾯的Spring框架有点特殊,它不属于任何⼀层;SpringMVC框架是处于表现层的,它是⼀个表现层框架。
从这张图可⼤致得出,不同的框架是各司其职的,它们解决某⼀层或者某⼀类的事情。
三、对⼀些主流框架的认识由于以下具体的框架都没有学过,所以只能说⼀说,我对这些框架的⼤体认识,可能对于某些框架没⽤使⽤过和对⽐过很难对它的优势有深刻的认识,只能在后续的学习中,深⼊理解。
1、Struts2框架Struts2框架处于三层架构的表现层,可以⽤来替代掉Servlet技术,来处理前端访问服务器的请求(如表单、页⾯提交过来的请求),所以Struts2是属于⼀个前端处理的框架。
下图显⽰了Struts2框架在三层架构中的位置:对于web⽇常的⼯作,⽐如获取请求参数、转发、重定向、校验参数等等,使⽤Servlet技术基本都可以完成。
实验三JSTL及MVC一、实验/实习过程1、实现mvc例子通过mvc 实现网页版的学生信息管理系统M:student Bean类存储学生对象的信息DataStore 封装数据库相关操作V:index.jsp list.jsp error.jsp edit.jspC:contrl数据库:在test数据库下创建表student2、在已经实现的例子上增加用户认证功能法1:数据库:在已有的student 表上新增一个列为登录密码修改已有的数据库操作方法,新增查询方法finduser()实现对于登录名和密码的查找V:修改index.jsp文件提供用户名和登录密码输入的界面法2:数据库:在数据库中建立一个登录用户信息表userM:实现一个登录的JavaBean login.classV:设计一个login.jsp界面用于用户输入信息的接收C:在已有的contrl中实现对于action 为login的处理截图未添加之前:添加账户;添加后的:进行删除后的数据库:如果添加重复的用户会出现错误:添加重复后:在这次试验中老师的代码和数据库进行了连接,然后是演出了结果,但是具体的连接过程和controller的用法还是没有完全弄明白,现在知道的是怎样通过jsp页面进行数据库的链接和数据的更改和删除集增加。
在试验中同时学习了将业务逻辑和显示给分开,怎样便于以后的二次开发和增加新的内容。
通过将业务逻辑和显示进行分开,可以使各个程序员的任务分开来。
分工合作可以增加工作效率。
各个程序员和相关的设计人员只要之前设计好借口就可以进行各自的任务分工,在同一时间进行一个项目的同时开工,这样个人的进度不会影响到其他人的设计进度,会大大的提高代码的重用和之后的安全工作。
这次试验中最后的试验是通过验证用户的登陆用户名和密码进行验证,只有验证通过的用户才能进行登录和继续操作。
关于mvc进行实现只有登录用户才能进行数据库操作。
这部分主要是注册过的用户进行存储,然后用户登录前先进行验证,如果数据库中有该用户的信息则进行信息比对验证过后才能对数据库进行操作。
JavaEE框架详解JavaEE(Java Enterprise Edition)是一种用于开发大型企业级应用程序的Java平台。
它提供了一整套标准化的API和开发工具,能够满足企业级应用开发的各种需求。
JavaEE框架是基于JavaEE平台的一种软件开发框架,它提供了一系列的组件和工具,可以帮助开发者更加高效、简便地开发和部署JavaEE应用。
本文将对JavaEE框架进行详细解析。
一、JavaEE框架概述JavaEE框架是构建JavaEE应用程序的基础设施。
它提供了一种基于组件的开发模式,开发者可以通过配置和组合不同的组件来构建应用程序。
JavaEE框架提供了一系列的标准化API、工具和解决方案,可以加速应用程序的开发过程。
JavaEE框架主要包括以下几个核心组件:1. Servlet容器:用于处理HTTP请求和响应,基于Servlet规范实现。
2. JSP容器:用于解析和执行JSP页面,基于JSP规范实现。
3. EJB容器:用于管理和执行企业级JavaBean,基于EJB规范实现。
4. JPA提供者:用于持久化Java对象到关系数据库,基于JPA规范实现。
二、常见的JavaEE框架1. Spring框架Spring框架是目前最流行的JavaEE框架之一。
它提供了一系列的模块,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等,可以帮助开发者更加高效地开发JavaEE应用程序。
Spring框架具有良好的可扩展性和灵活性,可以与其他框架无缝集成,被广泛应用于企业级应用开发。
2. Hibernate框架Hibernate是一个强大的对象关系映射(ORM)框架,用于将Java对象映射到关系数据库中的表结构。
它简化了数据库操作的编码工作,提供了一套面向对象的API,可以方便地进行数据库的增删改查操作。
Hibernate框架具有良好的跨数据库兼容性,支持的数据库种类非常丰富,被广泛应用于JavaEE应用程序的数据持久化层。
任务介绍(5分钟)根据需求分析和设计使用SSH框架实现商品档案管理模块商品档案增加、修改、查询、删除功能。
任务解析(50-60分钟)1.商品档案表映射文件Merchandise.hbm.xml编写2.商品档案实体映射类Merchandise编写3.前台商品档案增删改查页面编写4.后台业务控制器(action类)MerchandiseAction编写5.商品档案struts文件的配置6.用dwr框架实现商品编号重复性验证的dwr.xml编写7.后台业务处理层接口IMerchandiseService编写8.后台业务处理层实现类MerchandiseService编写9.后台持久化层接口IMerchandiseDao编写10.后台持久化层实现类MerchandiseDao编写11.Spirng配置文件applicationContext_beans.xml的配置详细步骤1.商品档案表映射文件Merchandise.hbm.xml编写删除商品时应删除与此商品相关的所有的订货单和进货单信息,与订货单和进货单相关级联关系中cascade属性的配置应该是all-delete-orphan。
关键代码如下:<hibernate-mapping><class name="com.zds.slms.domain.Merchandise" table="merchandise" > <id name="id" type="ng.Integer"><column name="id" /><generator class="identity" /></id><property name="code" type="string"><column name="code" length="3" not-null="true"><comment>商品编号</comment></column></property><property name="name" type="string"><column name="name" length="50" not-null="true"><comment>商品名称</comment></column></property><property name="price" type="float"><column name="price" precision="5" scale="2" not-null="true" ><comment>单价</comment></column></property><set name="stockins" table="stockin" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan"><key><column name="merchandiseid" not-null="true"><comment>进货单</comment></column></key><one-to-many class="com.zds.slms.domain.Stockin" /></set><set name="stockorders" table="stockorder" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan"><key><column name="merchandiseid" not-null="true"><comment>订货单</comment></column></key><one-to-many class="com.zds.slms.domain.Stockorder" /></set></class></hibernate-mapping>2.商品档案实体映射类Merchandise编写public class Merchandise implements java.io.Serializable {private Integer id;private String code;private String name;private float price;private Set stockins = new HashSet(0);private Set stockorders = new HashSet(0);public Merchandise() {}public Merchandise(String code, String name, float price) { this.code = code; = name;this.price = price;}public Merchandise(String code, String name, float price, Set stockins, Set stockorders) {this.code = code; = name;this.price = price;this.stockins = stockins;this.stockorders = stockorders;}//省略成员变量的get/set方法}3.前台商品档案增删改查页面编写商品档案新增页面addMerchandise.jsp页面的关键代码如下:<html><head><base href="<%=basePath%>" /><title>商品档案</title><link rel="stylesheet" href="css/main.css" type="text/css" /><script language="javascript" src="script/main.js"></script><script type='text/javascript' src='dwr/interface/merchandiseAction.js'>< /script><script type='text/javascript' src='dwr/engine.js'></script><script type='text/javascript' src='dwr/util.js'></script><script type="text/javascript">var textCode;var codeChk = false;var textAmount;function init() {textCode = document.getElementById("code");textAmount = document.getElementById("amount");textCode.focus();}function out_code() {codeChk = false;if (trimString(textCode.value).length>0 && trimString(textCode.va lue).length<4) {merchandiseAction.findMerchandiseByCode(textCode.value,functi on(ret){if (ret > 0) {show_message("msg_code","0",'输入的编号['+textCode.valu e+']重复请重新输入!');codeChk = false;} else {show_message("msg_code", "1", '输入正确!');codeChk = true;}});} else {show_message('msg_code', '0', '编号不能为空且不能超过3位长度!');codeChk = false;}}function out_amount() {var chk = false;if ((!isNaN(textAmount.value)) && textAmount.value>0 && textAmount. value<999){show_message("msg_amount", "1", '输入正确!');chk = true;} else {show_message('msg_amount', '0', '价格必须输入大于零小于999的数字形式');return chk;}function formSubmit() {var chk = false;var chkRetName=out_chkMaxLength('name','msg_name','名称小于10位且不能为空!','10');var chkRetAmount=out_amount();if (codeChk && chkRetName && chkRetAmount){chk = true;}return chk;}window.onload = init;</script></head><body><p></p><p><font style="font-size: 10pt;">档案管理->商品档案->新增</font></p><p></p><s:form action="merchandiseAction" method="post" theme="simple" on submit="return formSubmit();"><table border="0" cellpadding="1" cellspacing="1" width="95%"> <tr><td align="right" width="10%" nowrap="true">商品编号</td><td width="20%"><s:textfield name="merchandise.code" cssClass ="TextInput" id="code" onFocus="show_message('msg_code','2','请输入编号'); " onBlur="out_code()"></s:textfield> <DIV style="DISPLAY: show" id="msg_c ode" class="box_div_right"> </DIV> </td><td align="right" width="10%" nowrap="true">商品名称</td><td><s:textfield name="" cssClass="TextInput"id="name" onFocus="show_message('msg_name','2','请输入商品名称');" onBl ur="out_chkMaxLength('name', 'msg_name', '名称小于10位且不能为空!','10')"></ s:textfield> <DIV style="DISPLAY: show" id="msg_name" class="box_div_righ t"> </DIV> </td></tr><tr><td align="right" width="10%" nowrap="true">商品价格(元)</td><td width="20%"><s:textfield name="merchandise.price" cssClas s="TextInput" id="amount" onFocus="show_message('msg_amount','2','请输入商品价格')" onBlur="out_amount()"></s:textfield> <DIV style="DISPLAY: show" id="msg_amount" class="box_div_right"> </DIV> </td><td align="right" width="10%" nowrap="true"> </td><td colspan="2"> </td></tr></table><p></p><div style="margin-left: 30px; margin-right: 0px"><table border="0" cellpadding="0" cellspacing="0" width="95%"> <tr><td width="10%"><s:submit value="保存" cssClass="BtnAction" me thod="saveMerchandise"></s:submit></td><td width="10%"><input type="button" class="BtnAction" value="返回" onClick="history.go(-1);"></td><td width="80%"> </td></tr></table></s:form></body></html>商品档案修改页面updateMerchandise.jsp页面的关键代码如下:<html><head><base href="<%=basePath%>" /><title>商品档案</title><link rel="stylesheet" href="css/main.css" type="text/css" /><script language="javascript" src="script/main.js"></script><script type='text/javascript' src='dwr/interface/merchandiseAction.j s'></script><script type='text/javascript' src='dwr/engine.js'></script><script type='text/javascript' src='dwr/util.js'></script><script type="text/javascript">var textAmount;function init() {textAmount = document.getElementById("amount");}function out_amount() {var chk = false;if ((!isNaN(textAmount.value)) && textAmount.value > 0 && text Amount.value < 999) {show_message("msg_amount", "1", '输入正确!');chk = true;} else {show_message('msg_amount', '0', '价格必须输入大于零小于999的数字形式');}return chk;}function formSubmit() {var chk = false;var chkRetName = out_chkMaxLength('name', 'msg_name', '名称小于10位且不能为空!','10');var chkRetAmount = out_amount();if (chkRetName && chkRetAmount) {chk = true;}return chk;}window.onload = init;</script></head><body><p></p><s:form action="merchandiseAction" method="post" theme="si mple" onsubmit="return formSubmit();"><s:hidden name="merchandise.id"></s:hidden><s:hidden name="merchandise.code"></s:hidden><p><font style="font-size: 10pt;">档案管理->商品档案->新增</font> </p><p></p><table border="0" cellpadding="1" cellspacing="1" width="95%"> <tr><td align="right" width="10%" nowrap="true">商品编号</td><td width="20%"><s:textfield name="merchandise.code" cssClass="TextInput" disabled="true"></s:textfield></td><td align="right" width="10%" nowrap="true">商品名称</td><td><s:textfield name="" cssClass="TextInput" id="name" onFocus="show_message('msg_name','2','请输入名称');" onBlur="out _chkMaxLength('name', 'msg_name', '名称小于10位且不能为空!', 10)"></s:textfi eld> <DIV style="DISPLAY: show" id="msg_name" class="box_div_right"> &nbs p; </DIV> </td></tr><tr><td align="right" width="10%" nowrap="true">商品价格(元)</td><td width="20%"><s:textfield name="merchandise.price" cssClass="TextInput " id="amount" onFocus="show_message('msg_amount','2','请输入商品价格')" onB lur="out_amount()"></s:textfield> <DIV style="DISPLAY: show" id="msg_amou nt" class="box_div_right"> </DIV></td><td align="right" width="10%" nowrap="true"> </td><td colspan="2"> </td></tr></table><p></p><div style="margin-left: 30px; margin-right: 0px"><table border="0" cellpadding="0" cellspacing="0" width="95%"> <tr><td width="10%"><s:submit value="保存" method="updateMerchandise" cssC lass="BtnAction"></s:submit> </td><td width="10%"><input type="button" class="BtnAction" value="返回" on Click="history.go(-1);"></td><td width="80%"> </td></tr></table></div></s:form></body></html>商品档案查询页面merchandise.jsp页面的关键代码如下:<s:form action="merchandiseAction" method="post" theme="simple"><p></p><table border="0" cellpadding="1" cellspacing="1" width="95%"> <tr><td align="right" width="10%" nowrap="true">商品编号</td><td width="20%"><s:textfield name="merchandise.code" cssClass="TextIn put"></s:textfield> </td><td align="right" width="10%" nowrap="true">商品名称</td><td width="20%"><s:textfield name="" cssClass="TextIn put"></s:textfield> </td><td align="right" width="15%"> </td><td width="20%"> </td><td width="10%"> </td></tr><tr><td align="right" width="10%" nowrap="true"> </td><td width="20%"> </td><td width="70%" colspan="5"> </td></tr></table><p></p><div style="margin-left: 30px; margin-right: 0px"><table border="0" cellpadding="0" cellspacing="0" width="95% "><tr><td width="10%"><s:submit value="查找" cssClass="BtnAction" method="findMe rchandise"></s:submit></td><td width="10%"><input type="button" class="BtnAction" value="新增" onClic k="replaceModulUrl('<%=basePath%>moduls/archive/addMerchandise.jsp');""> </td><td width="10%"><input type="button" onClick="deleteRecords('merchandiseA ction!deleteMerchandise.action')" value="删除" class="BtnAction" /> </td> <td width="10%"><input type="reset" value="重置" class="BtnAct ion" /></td><td width="60%"> </td></tr></table></div><p></p><div style="margin-left: 30px; margin-right: 0px"><table width="90%" border="1" cellpadding="0" cellspacing="0"><tr><td width="9%" class="td_title">选择</td><td width="11%" class="td_title">修改</td><td width="17%" class="td_title">商品编号</td><td width="40%" class="td_title">商品名称</td><td width="23%" class="td_title">商品价格(元)</td></tr><s:iterator var="merchandise" value="merchandises"><tr><td align="center" class="td_border"><input name="merchandiseId" type="checkbox" title="选中后可进行删除操作" value='<s:property value="#mer chandise.id" />'> </td><td align="center" class="td_border"><a href='merchandiseAction!p reUpdateMerchandise.action?merchandise.id=<s:property value="#merchandise. id" />'><img src="image/edit.gif" border="0"></a> </td><td class="td_border"><s:property value="#merchandise.code"/></t d><td class="td_border"><s:property value="#"/></t d><td class="td_border"><s:property value="#merchandise.price"/></ td></tr></s:iterator></table></div></s:form>4.后台业务控制器(action类)MerchandiseAction编写public class MerchandiseAction extends ActionSupport {// 商品档案业务处理接口private IMerchandiseService merchandiseService;private Merchandise merchandise = new Merchandise();// 查询结果集private List<Merchandise> merchandises = new ArrayList<Merchandise> ();// 操作结束后跳转的地址private String finish_Url;// 要删除的商品IDprivate String[] merchandiseId;// 商品档案查询public String findMerchandise() {merchandises = merchandiseService.findMerchandise(merchandise);return "findMerchandise";}// 商品档案保存public String saveMerchandise() {merchandiseService.saveMerchandise(merchandise);finish_Url = "merchandiseAction!findMerchandise.action";return "finish";}//商品档案删除public String deleteMerchandise() {merchandiseService.deleteMerchandise(merchandiseId);finish_Url = "merchandiseAction!findMerchandise.action";return "finish";}//商品档案更新public String updateMerchandise() {merchandiseService.updateMerchandise(merchandise);finish_Url = "merchandiseAction!findMerchandise.action";return "finish";}//商品档案更新前查询public String preUpdateMerchandise() {merchandise = merchandiseService.findMerchandise(merchandise).get (0);return "updateMerchandise";}//商品档案查询public int findMerchandiseByCode(String code) {merchandise = new Merchandise();merchandise.setCode(code);merchandises = merchandiseService.findMerchandise(merchandise);return merchandises.size();}//以下省略成员变量的get/set方法}5.商品档案struts文件的配置在struts.xml配置文件中添加商品档案的相关配置请参考任务解析部分的相关内容。