最小化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  的详细结构流程



基本的先介绍到这里,有了新的理解,和更深层的认识 会持续更新。






0 0
原创粉丝点击