最小化SSH框架结构理解
来源:互联网 发布:linux 安装svn服务器 编辑:程序博客网 时间:2024/06/05 04:48
/***注,本文的代码已经上传到阿里云code,svn地址:http://code.taobao.org/svn/JdevAppdemo/ 但是需要我添加你,有兴趣的可以私聊我 oracle数据库表 想要的我也可以发*****/
公司最近在用ssh框架开发系统,好奇拿来玩玩。本着我菜,你比我还菜的不要脸精神,跟大家分享一下~
首先介绍一下公司框架的基本结构:
省略了dao,数据库持久层(就是操作底层数据的方法)操作放在了service中
项目是用maven管理的。
model创建oracle数据库表的实体,Service中进行后台操作,例如数据库数据的保存,修改,删除操作等,Action进行前台的信息操作,Form进行前台的数据交换。
好了,最终效果还好吧,哈哈-----看到点希望之后,就开始从头实践一下~
我来用controlSyntax(语法控制)这个对象来举例,其实这是一个公司自己开发的一个小工具系统,主要用来向数据库录入一些数据(太复杂的我也不能详细解释,毕竟涉及到保密,就理解大概意思就好--这个系统是向数据库存数据的)
第一步:(正常的流程第一步应该是 创建数据表结构,生成model,由于现在的辅助工具,IDE插件比较强大,所以在这里先不做说明,有兴趣的可以自行google)
创建文件:主要创建的文件有
ControlSyntaxOperService.java(接口) impl-----ControlSyntaxOperServiceImpl.java(实现类)
| |
抽象方法先写好
要实现的功能有:查询方法,普通查询方法,
分页查询方法,新增/修改方法,
删除方法
ControlSyntaxAction.java(Action类) form------ControlSyntaxForm.java(Form类)
controlSyntaxList.jsp controlSyntaxOperPage.jsp
第二步:写代码,哈哈 终于开始了~~
先写service接口 抽象方法
public interface ControlSyntaxOperService {public List<ControlSyntax> queryControlSyntaxOfList(ControlSyntax controlSyntax);public PageInfo queryControlSyntaxOfPage(ControlSyntax controlSyntax,PageInfo pageInfo);public ControlSyntax getControlSyntax(String Id);public String operControlSyntax(ControlSyntax controlSyntax);public void deleteControlSyntax(String id);}写接口实现:
@Service(value="controlSyntaxService")public class ControlSyntaxOperServiceImpl implements ControlSyntaxOperService{@Autowiredprotected BaseDao baseDao;private Object queryControlSyntaxOfCommon(ControlSyntax controlSyntax, PageInfo pageInfo) { StringBuffer sqlBuf = new StringBuffer(32); sqlBuf.append("From " + ControlSyntax.ENTITY_NAME ) .append(" WHERE 1=1 ") .append(" /~ AND name like '%' || :name || '%' ~/ "); Map<String, Object> params = new HashMap<String, Object>(); if(controlSyntax == null){ controlSyntax = new ControlSyntax(); } params.put("name", controlSyntax.getName()); return null == pageInfo ? baseDao.queryForList(sqlBuf.toString(), params) : baseDao.queryForPage(sqlBuf.toString(), params, pageInfo);}//普通查询方法public List<ControlSyntax> queryControlSyntaxOfList(ControlSyntax controlSyntax) {return (List<ControlSyntax>)queryControlSyntaxOfCommon(controlSyntax, null);}//分页查询方法public PageInfo queryControlSyntaxOfPage(ControlSyntax controlSyntax, PageInfo pageInfo) {return (PageInfo) this.queryControlSyntaxOfCommon(controlSyntax, pageInfo);}//根据id获取详情--注意方法名get开头public ControlSyntax getControlSyntax(String id) {Assert.notNull(id, "主键不为空");ControlSyntax controlSyntax = (ControlSyntax) baseDao.get(ControlSyntax.class, id);return controlSyntax;}//新增,修改方法,当id为空时新增,不为空时修改public String operControlSyntax(ControlSyntax controlSyntax) {String id = controlSyntax.getId();if(StringUtils.isEmpty(id)){baseDao.save(controlSyntax);}else{ControlSyntax dbControlSyntax = (ControlSyntax) baseDao.get(ControlSyntax.class, id);BeanCopyUtil.copyBeanProperties(controlSyntax,dbControlSyntax);baseDao.update(controlSyntax);}return "";}//删除方法public void deleteControlSyntax(String id){Assert.notNull(id,"主键不为空");ControlSyntax controlSyntax = (ControlSyntax) baseDao.get(ControlSyntax.class, id);baseDao.delete(controlSyntax);}}接下来是Action方法:
@Controllerpublic class ControlSyntaxAction extends ZPageManageBaseAction{@AutowiredControlSyntaxOperService controSyntaxOperService;protected String getPageFolder() {return "controlSyntax";}//进入列表方法@RequestMapping(value = "zpage/controlSyntaxList")public String controlSyntaxList(ControlSyntaxForm form,ModelMap modelMap){//分页显示信息PageInfo pageInfo = controSyntaxOperService.queryControlSyntaxOfPage(form.getControlSyntax(), form.getPageInfo());modelMap.put("pageInfo", pageInfo);//翻译(用枚举类)Map<String,EnumSyntaxType> enumSyntaxTypeMap = EnumSyntaxType.obtainValueMap();modelMap.put("enumSyntaxTypeMap", enumSyntaxTypeMap);return super.wrapPage("controlSyntaxList");}//新增、编辑操作@RequestMapping(value="zpage/controlSyntaxOperPage")public String controlSyntaxOperPage(ControlSyntaxForm form,ModelMap modelMap){//调用serviceMap<String,EnumSyntaxType> enumSyntaxTypeMap = EnumSyntaxType.obtainValueMap();modelMap.put("enumSyntaxTypeMap", enumSyntaxTypeMap);String id = form.getId();if(StringUtils.isEmpty(id)){ControlSyntax controlSyntax = new ControlSyntax();modelMap.put("controlSyntax", controlSyntax);}else{ControlSyntax controlSyntax = controSyntaxOperService.getControlSyntax(id);modelMap.put("controlSyntax", controlSyntax);}return super.wrapPage("controlSyntaxOperPage");}//新增@RequestMapping(value="zpage/controlSyntaxOper")public Map<String, Object> controlSyntaxOper(ControlSyntaxForm form){JDevActionResult result;try {String msg = controSyntaxOperService.operControlSyntax(form.getControlSyntax());if(StringUtils.isEmpty(msg)){result=super.createResultOfSuccess();}else {result=super.createResultOfFaild();result.buildMsgOfCustom(msg);}} catch (Exception e) {result=super.createResultOfFaild();result.buildMsgOfCustom("操作失败");MyWebContextHolder.recordRunException(this,e, "数据新增异常,新增失败");}return result;}//删除@RequestMapping(value="zpage/controlSyntaxDelete")public Map<String, Object> controlSyntaxDelete(ControlSyntaxForm form,ModelMap modelMap){JDevActionResult result;try {controSyntaxOperService.deleteControlSyntax(form.getId());result=super.createResultOfSuccess();}catch(DataIntegrityViolationException ex) {//数据完整性异常result=super.createResultOfFaild();result.buildMsgOfCustom("数据删除异常,违约数据信息完整性,删除失败");MyWebContextHolder.recordRunException(this,ex, "数据删除异常,违反数据信息完整性,删除失败");}catch (Exception e) {result=super.createResultOfFaild();result.buildMsgOfCustom("操作失败");MyWebContextHolder.recordRunException(this,e, "数据删除异常,删除失败");}return result;}}然后是form代码:
public class ControlSyntaxForm extends JDevPageForm{private static final long serialVersionUID = 1L;//语法表字段private String id;private ControlSyntax controlSyntax;//set--get方法public String getId() {return id;}public void setId(String id) {this.id = id;}public ControlSyntax getControlSyntax() {return controlSyntax;}public void setControlSyntax(ControlSyntax controlSyntax) {this.controlSyntax = controlSyntax;}}
最后是两个jsp页面,下边第一个是列表页面,第二个是新增编辑页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ include file="/common/inc.jsp" %><page:header title="语法" ><script>function operControlSyntax(id){var w=$(window.parent).width()*0.55;var h=$(window.parent).height()*0.65; var detailOP = new ShowDetailOp();detailOP.url="${base}/zpage/controlSyntaxOperPage.do?id="+id;detailOP.width=w;detailOP.height=h;detailOP.callback=function(data){formSearch();};detailOP.execute();}function deleteControlSyntax(id){var delOp = new DeleteOp();delOp.url='${base}/zpage/controlSyntaxDelete.do?id='+id;delOp.message='您确认要删除该笔记录吗?\n\n删除后将无法恢复。';delOp.callback=function(data){if(data.flag){parent.Dialog.alert(data.msg,function(){ formSearch();}); }else{ parent.Dialog.alert(data.msg); }};delOp.execute();}function formSearch(){ $("#formList").submit(); }</script></page:header><div class="row"><form id="formList" name="formList" method="post" action="${base}/zpage/controlSyntaxList.do"> <table width="99%" border="0" align="center"> <tr> <td width="50" align="right">名称:</td> <td width="80" > <input type="text" name="controlSyntax.name" value="${controlSyntax.name }" id="name" class="form-control" style="width: 200px" onkeydown="if(event.keyCode==13)formSearch()" style="float:left;" /> </td> <td align="right" > <div style="margin-right: -1px"> <page:button value="查询" btnClass="btn-info" iconClass="icon-search" id="find" onClick="formSearch()"></page:button> <page:button value="新增" btnClass="btn-success" iconClass="icon-plus " id="add" onClick="operControlSyntax('');"></page:button> </div> </td> </tr> </table> </form></div><div class="space-6"></div><div class="row"> <table class="table table-striped table-bordered table-hover" mode="list"> <thead> <tr> <th width="5%" align="center" nowrap="nowrap">序号</th> <th width="15%" align="center" nowrap="nowrap">名称</th> <th width="15%" align="center" nowrap="nowrap">类型</th> <th width="15%" align="center" nowrap="nowrap">语法</th> <th width="15%" align="center" nowrap="nowrap">参数</th> <th width="15%" align="center" nowrap="nowrap">排除值</th> <th width="20%" align="center" nowrap="nowrap">操作</th> </tr> </thead> <tbody> <c:choose> <c:when test="${empty pageInfo.dataList}"> <tr> <td colspan="6">无结果记录</td> </tr> </c:when> <c:otherwise> <c:forEach var="row" items="${pageInfo.dataList}" varStatus="vs"> <tr> <td nowrap="nowrap" title = "${row.id }"> ${vs.index + 1 } </td> <td nowrap="nowrap" title = "${row.name }"> ${row.name } </td> <td nowrap="nowrap" title = "${enumSyntaxTypeMap[row.type].name }"> ${enumSyntaxTypeMap[row.type].name } </td> <td nowrap="nowrap" > ${row.syntax } </td> <td nowrap="nowrap" title = "${row.params }"> ${row.params } </td> <td nowrap="nowrap" > ${row.excludeVals } </td> <td nowrap="nowrap" align="center"><button class="btn btn-xs btn-success" onclick="operControlSyntax('${row.id}');" title="修改"><i class="icon-edit bigger-120"></i></button><button class="btn btn-xs btn-danger" onclick="deleteControlSyntax('${row.id}');" title="删除"><i class="icon-trash bigger-120"></i></button> </td> </tr> </c:forEach> </c:otherwise> </c:choose> </tbody> </table> </div> <div class="row"> <jsp:include page="/common/pageInfo.jsp"/> </div><script> autoStyle();</script> <page:footer></page:footer></html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ include file="/common/inc.jsp" %><page:header title="语法新增/编辑" ><script type="text/javascript">function saveControlSyntax(){ var saveOp = new AjaxFormOp(); saveOp.form=document.getElementById("createControlSyntaxForm"); saveOp.opName='保存语法配置'; saveOp.beforeSubmit=function(){}; saveOp.success=function(data){ if(data.flag){ top.Dialog.alert(data.msg,function(){ top.Dialog.runCallbackAndClose(data) }); }else{ alert(data.msg); } }; saveOp.execute();}function setDefaultRemarkInfo(domId) {var slctObj=$("#"+domId+" option:selected");var type = $("#"+domId).val();var defaultRemark = $(slctObj).attr("remark");if("${controlSyntax.id}" == "") {//新增,直接切换默认值$("#remark").val(defaultRemark);}else {//编辑需要判断当前remark是否有值。var remark = $("#remark").val();if(remark != "") {if(type == "${controlSyntax.type}") { //还原$("#remark").val("${controlSyntax.remark}");}else {$("#remark").val(defaultRemark);}}else {$("#remark").val(defaultRemark);}}}</script><style>select{width:200px};</style></page:header><form name="createControlSyntaxForm" action="${base}/zpage/controlSyntaxOper.do" id="createControlSyntaxForm" method="post"><input type = "hidden" value = "${controlSyntax.id}" name = "controlSyntax.id" id = "id"/><table id="sample-table-1" class="table table-bordered"><tr><td>名称</td><td ><input type="text" class="defaultText" notNull="true" id = "name" name = "controlSyntax.name" value="${controlSyntax.name}"/></td><td>类型</td><td> <select id="type" name="controlSyntax.type" class="defaultText" onchange="setDefaultRemarkInfo(this.id)"> <option value="">==请选择==</option> <c:forEach items="${enumSyntaxTypeMap }" var="item"> <option value="${item.key }" remark="${enumSyntaxTypeMap[item.key].remark }" <c:if test="${controlSyntax.type eq item.key }">selected="selected"</c:if> >${enumSyntaxTypeMap[item.key].name }</option> </c:forEach> </select></td></tr><tr><td>语法</td><td colspan="3"><textarea id="syntax" name="controlSyntax.syntax" style="width: 68%;height: 100px;" notNull="true">${controlSyntax.syntax }</textarea></td></tr><tr><td>参数</td><td colspan="3"><textarea id="params" name="controlSyntax.params" style="width: 68%;height: 40px;" >${controlSyntax.params }</textarea></td></tr><tr><td>备注</td><td colspan="3"><textarea id="remark" name="controlSyntax.remark" style="width: 68%;height: 100px;">${controlSyntax.remark }</textarea></td></tr> </table></form> <div class="btGroup"> <div align="center"> <page:button value="保存" btnClass="btn btn-purple" iconClass="icon-save" id="save" onClick="saveControlSyntax()"></page:button> <page:button value="取消" btnClass="btn btn-warning" iconClass="icon-undo" id="cancel" onClick="dialogClose()"></page:button> </div> </div><script> autoStyle();</script><page:footer></page:footer>
如果你觉得我把代码一复制-粘贴 帖子就写完了,那我就太LOW了,哈哈
下面的内容才刚刚开始:
作为一个有强迫症的人,不把结构弄清楚是不会罢休的。
ssh框架 struts spring hibernate / spring springMVC hibernate 是主流的java集成开发框架,详细介绍可以自行google,这里只说我自己的理解的东西。
(个人感觉,有兴趣可以自己搭建ssh框架,可以用MyEclipse搭建也可以自己纯手动下载搭建,熟悉了整个过程之后就会对框架有一个全面了解。)
--其实我还没有完整的搭过 T^T 蓝瘦,任重而道远啊。
下面分析一下,model----service-----Action-----form-----jap 的详细结构流程
基本的先介绍到这里,有了新的理解,和更深层的认识 会持续更新。
- 最小化SSH框架结构理解
- SSH框架结构配置
- SSH框架结构分析
- ssh框架结构分析
- ssh框架结构分析
- SSH框架结构分析
- SSH框架结构分析
- Client/Server框架结构的理解
- 理解ssh
- 最小化安装的CentOS6配置SSH免密码登录
- SSH框架的理解
- SSH框架的理解
- SSH的简单理解
- SSH的简易理解
- SSH-理解struts1架构
- 对SSH的理解
- ssh的理解
- 对SSH理解
- asp:GridView 使用增加删除行
- 从setContentView谈谈android的布局层级
- 一个“老”程序员的思考
- Asp.net mvc新手指导入门基本操作
- 51nod-1413 权势二进制
- 最小化SSH框架结构理解
- TabLayout不正常显示标签->TabLayout和ViewPager的恩恩怨怨
- 关于maven和tomcat命令,maven项目编译不到tomcat下问题
- Python中的数据类型
- Unity手游之路<八>自动寻路Navmesh之入门
- 下面结合代码介绍HashMap与TreeMap按照key和value排序。
- JavaScript中你所不知道的数组ArrayBuffer
- ibus: ImportError: No module named gtk
- spirng 配置数据源