最小化SSH框架结构理解

/***注,本文的代码已经上传到阿里云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{
	
	@Autowired
	protected 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方法:

@Controller
public class ControlSyntaxAction extends ZPageManageBaseAction{

	@Autowired
	ControlSyntaxOperService 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){
			//调用service
			Map<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" 
	      			οnkeydοwn="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" οnclick="operControlSyntax('${row.id}');" title="修改">
						<i class="icon-edit bigger-120"></i>
					</button>
					<button class="btn btn-xs btn-danger" οnclick="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" οnchange="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  的详细结构流程



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






以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值