/***注,本文的代码已经上传到阿里云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 的详细结构流程
基本的先介绍到这里,有了新的理解,和更深层的认识 会持续更新。