您好,登錄后才能下訂單哦!
這篇文章主要介紹了SSH如何實現信息發布管理,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
信息發布的開發,還是遵循從entity->dao->service->action->config的方式進行。
這里面有幾個知識點:
(1)對于表單中的大數據量文本域,在映射文件(*.hbm.xml)中其類型應使用text。
例如:Java文件中
private String content;
在Hibernate映射文件中
<property name="content" column="content" type="text"></property>
(2)對于Date、Calendar、Timstamp的理解
Java文件中
private Timestamp createTime;
在Hibernate映射文件中
<property name="createTime" column="create_time" type="java.sql.Timestamp"></property>
(3)抽取BaseService
(4)在新增頁面,顯示當前時間
Java代碼
info = new Info(); info.setCreateTime(new Timestamp(new Date().getTime())); // 是為了在頁面中顯示出當前時間
在JSP頁面中顯示時間的struts標簽
<s:date name="createTime" format="yyyy-MM-dd HH:mm"/>
(5)在HTML標簽的id值 結合數據庫中主鍵 的使用,使得HTML標簽的id值不會重復
1、entity層
Info.java
package com.rk.tax.entity; import java.io.Serializable; import java.sql.Timestamp; import java.util.HashMap; import java.util.Map; public class Info implements Serializable { private String infoId; private String type; private String source; private String title; private String content; private String memo; private String creator; private Timestamp createTime; private String state; //狀態 public static String INFO_STATE_PUBLIC = "1";//發布 public static String INFO_STATE_STOP = "0";//停用 //信息分類 public static String INFO_TYPE_TZGG = "tzgg"; public static String INFO_TYPE_ZCSD = "zcsd"; public static String INFO_TYPE_NSZD = "nszd"; public static Map<String, String> INFO_TYPE_MAP; static{ INFO_TYPE_MAP = new HashMap<String, String>(); INFO_TYPE_MAP.put(INFO_TYPE_TZGG, "通知公告"); INFO_TYPE_MAP.put(INFO_TYPE_ZCSD, "政策速遞"); INFO_TYPE_MAP.put(INFO_TYPE_NSZD, "納稅指導"); } // {{ public String getInfoId() { return infoId; } public void setInfoId(String infoId) { this.infoId = infoId; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getMemo() { return memo; } public void setMemo(String memo) { this.memo = memo; } public String getCreator() { return creator; } public void setCreator(String creator) { this.creator = creator; } public Timestamp getCreateTime() { return createTime; } public void setCreateTime(Timestamp createTime) { this.createTime = createTime; } public String getState() { return state; } public void setState(String state) { this.state = state; } // }} }
Info.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.rk.tax.entity" auto-import="true"> <class name="Info" table="T_Info"> <id name="infoId" column="info_id" type="java.lang.String" length="32"> <generator class="uuid.hex"></generator> </id> <property name="type" column="type" type="java.lang.String" length="10"></property> <property name="source" column="source" type="java.lang.String" length="50"></property> <property name="title" column="title" type="java.lang.String" length="100"></property> <property name="content" column="content" type="text"></property> <property name="memo" column="memo" type="java.lang.String" length="200"></property> <property name="creator" column="creator" type="java.lang.String" length="10"></property> <property name="createTime" column="create_time" type="java.sql.Timestamp" length="19"></property> <property name="state" column="state" type="java.lang.String" length="1"></property> </class> </hibernate-mapping>
2、dao層
InfoDao.java
package com.rk.tax.dao; import com.rk.core.dao.BaseDao; import com.rk.tax.entity.Info; public interface InfoDao extends BaseDao<Info> { }
InfoDaoImpl.java
package com.rk.tax.dao.impl; import com.rk.core.dao.impl.BaseDaoImpl; import com.rk.tax.dao.InfoDao; import com.rk.tax.entity.Info; public class InfoDaoImpl extends BaseDaoImpl<Info> implements InfoDao { }
關于BaseDao和BaseDaoImpl可以查看 http://lsieun.blog.51cto.com/9210464/1835776
3、service層
這里要抽取一個通用的Service,即BaseService。
BaseService.java
package com.rk.core.service; import java.io.Serializable; import java.util.List; public interface BaseService<T> { //新增 public void save(T entity); //更新 public void update(T entity); //根據id刪除 public void delete(Serializable id); //根據id查找 public T findById(Serializable id); //查找列表 public List<T> findAll(); }
BaseServiceImpl.java 這里雖然通過baseDao完成了相應的操作,但是還是應該給baseDao提供一個具體的實例變量才能執行操作,否則會報null異常。在這個項目中,所有的dao、service都是由Spring的IOC容器進行管理,那么應該如何讓Spring的IOC容器為BaseServiceImpl注入baseDao呢?答案:通過BaseServiceImpl的子類完成注入。
package com.rk.core.service.Impl; import java.io.Serializable; import java.util.List; import com.rk.core.dao.BaseDao; import com.rk.core.service.BaseService; public class BaseServiceImpl<T> implements BaseService<T> { private BaseDao<T> baseDao; public void setBaseDao(BaseDao<T> baseDao) { this.baseDao = baseDao; } public void save(T entity) { baseDao.save(entity); } public void update(T entity) { baseDao.update(entity); } public void delete(Serializable id) { baseDao.delete(id); } public T findById(Serializable id) { return baseDao.findById(id); } public List<T> findAll() { return baseDao.findAll(); } }
InfoService.java
package com.rk.tax.service; import com.rk.core.service.BaseService; import com.rk.tax.entity.Info; public interface InfoService extends BaseService<Info> { }
InfoServiceImpl.java 注意:這里通過對infoDao的注入,來同時完成baseDao的注入。
package com.rk.tax.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.rk.core.service.Impl.BaseServiceImpl; import com.rk.tax.dao.InfoDao; import com.rk.tax.entity.Info; import com.rk.tax.service.InfoService; @Service("infoService") public class InfoServiceImpl extends BaseServiceImpl<Info> implements InfoService { private InfoDao infoDao; @Resource public void setInfoDao(InfoDao infoDao) { setBaseDao(infoDao); this.infoDao = infoDao; } }
4、action層
InfoAction.java
package com.rk.tax.action; import java.sql.Timestamp; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import com.rk.core.action.BaseAction; import com.rk.tax.entity.Info; import com.rk.tax.service.InfoService; @Controller("infoAction") @Scope("prototype") public class InfoAction extends BaseAction { /*****1、業務數據*****/ private List<Info> infoList; private Info info; /*****2、業務實現類*****/ @Resource private InfoService infoService; /*****3、響應JSP頁面的操作*****/ //列表頁面 public String listUI(){ //加載分類集合 ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP); infoList = infoService.findAll(); return "listUI"; } //跳轉到新增頁面 public String addUI(){ //加載分類集合 ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP); info = new Info(); info.setCreateTime(new Timestamp(new Date().getTime())); // 是為了在頁面中顯示出當前時間 return "addUI"; } //保存新增 public String add(){ if(info != null){ infoService.save(info); } return "list"; } //跳轉到編輯頁面 public String editUI(){ //加載分類集合 ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP); if(info != null && info.getInfoId() != null){ info = infoService.findById(info.getInfoId()); } return "editUI"; } //保存編輯 public String edit(){ if(info != null){ infoService.update(info); } return "list"; } //刪除 public String delete(){ if(info != null && info.getInfoId() != null){ infoService.delete(info.getInfoId()); } return "list"; } //批量刪除 public String deleteSelected(){ if(selectedRow != null){ for(String id : selectedRow){ infoService.delete(id); } } return "list"; } //異步發布信息 public void publicInfo(){ try { if(info != null && info.getInfoId()!= null){ //1、更新信息狀態 Info temp = infoService.findById(info.getInfoId()); temp.setState(info.getState()); infoService.update(temp); //2、輸出更新結果 HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/html"); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("更新狀態成功".getBytes("utf-8")); outputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } // {{ public List<Info> getInfoList() { return infoList; } public void setInfoList(List<Info> infoList) { this.infoList = infoList; } public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } // }} }
5、config
(1)entity層配置
就是Hibernate的映射文件
(2)dao層配置,就是將dao注入到Spring的IOC容器中
<bean id="infoDao" class="com.rk.tax.dao.impl.InfoDaoImpl" parent="baseDao"></bean>
(3)service層配置,就是將service注入到Spring的IOC容器中
<!-- 開啟注解掃描 --> <context:component-scan base-package="com.rk.tax.service.impl"></context:component-scan>
(4)action層配置,一是將action注入到Spring的IOC容器中,二是將action在struts中進行url的映射
(5)最后保存所有的配置都匯總到applicationContext和struts.xml中
6、前臺JSP頁面
6.1、listUI.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <%@include file="/common/header.jsp"%> <title>信息發布管理</title> <script type="text/javascript"> //全選、全反選 function doSelectAll(){ // jquery 1.6 前 //$("input[name=selectedRow]").attr("checked", $("#selAll").is(":checked")); //prop jquery 1.6+建議使用 $("input[name=selectedRow]").prop("checked", $("#selAll").is(":checked")); } //新增 function doAdd(){ document.forms[0].action = "${basePath}/tax/info_addUI.action"; document.forms[0].submit(); } //編輯 function doEdit(id){ document.forms[0].action = "${basePath}/tax/info_editUI.action?info.infoId="+id; document.forms[0].submit(); } //刪除 function doDelete(id){ document.forms[0].action = "${basePath}/tax/info_delete.action?info.infoId="+id; document.forms[0].submit(); } //批量刪除 function doDeleteAll(){ document.forms[0].action = "${basePath}/tax/info_deleteSelected.action"; document.forms[0].submit(); } //異步發布信息,信息的id及將要改成的信息狀態 function doPublic(infoId, state){ //1、更新信息狀態 $.ajax({ url:"${basePath}/tax/info_publicInfo.action", data:{"info.infoId":infoId,"info.state":state}, type:"post", success:function(msg){ //2、更新狀態欄、操作攔的顯示值 if("更新狀態成功" == msg){ if(state == 1){//說明信息狀態已經被改成 發布,狀態欄顯示 發布,操作欄顯示 停用 $('#show_'+infoId).html("發布"); $('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',0)">停用</a>'); } else{ $('#show_'+infoId).html("停用"); $('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',1)">發布</a>'); } } else{ alert("更新信息狀態失敗!"); } }, error:function(){ alert("更新信息狀態失敗!"); } }); } </script> </head> <body class="rightBody"> <form name="form1" action="" method="post"> <div class="p_d_1"> <div class="p_d_1_1"> <div class="content_info"> <div class="c_crumbs"><div><b></b><strong>信息發布管理</strong></div> </div> <div class="search_art"> <li> 信息標題:<s:textfield name="info.title" cssClass="s_text" id="infoTitle" cssStyle="width:160px;"/> </li> <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li> <li > <input type="button" value="新增" class="s_button" onclick="doAdd()"/> <input type="button" value="刪除" class="s_button" onclick="doDeleteAll()"/> </li> </div> <div class="t_list" > <table width="100%" border="0"> <tr class="t_tit"> <td width="30" align="center"><input type="checkbox" id="selAll" onclick="doSelectAll()" /></td> <td align="center">信息標題</td> <td width="120" align="center">信息分類</td> <td width="120" align="center">創建人</td> <td width="140" align="center">創建時間</td> <td width="80" align="center">狀態</td> <td width="120" align="center">操作</td> </tr> <s:iterator value="infoList" status="st"> <tr <s:if test="#st.odd"> bgcolor="f8f8f8" </s:if> > <td align="center"><input type="checkbox" name="selectedRow" value="<s:property value='infoId'/>"/></td> <td align="center"><s:property value="title"/></td> <td align="center"> <s:property value="#infoTypeMap[type]"/> </td> <td align="center"><s:property value="creator"/></td> <td align="center"><s:date name="createTime" format="yyyy-MM-dd HH:mm"/></td> <td id="show_<s:property value='infoId'/>" align="center"><s:property value="state==1?'發布':'停用'"/></td> <td align="center"> <span id="oper_<s:property value="infoId"/>"> <s:if test="state==1"> <a href="javascript:doPublic('<s:property value="infoId" />',0)">停用</a> </s:if> <s:else> <a href="javascript:doPublic('<s:property value="infoId"/>',1)">發布</a> </s:else> </span> <a href="javascript:doEdit('<s:property value='infoId'/>')">編輯</a> <a href="javascript:doDelete('<s:property value='infoId'/>')">刪除</a> </td> </tr> </s:iterator> </table> </div> </div> <div class="c_pate" > <table width="100%" class="pageDown" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="right"> 總共1條記錄,當前第 1 頁,共 1 頁 <a href="#">上一頁</a> <a href="#">下一頁</a> 到 <input type="text" onkeypress="if(event.keyCode == 13){doGoPage(this.value);}" min="1" max="" value="1" /> </td> </tr> </table> </div> </div> </div> </form> </body> </html>
知識點(1):struts中顯示時間的標簽
<s:date name="createTime" format="yyyy-MM-dd HH:mm"/>
知識點(2):判斷與字符串相等
<s:property value="state==1?'發布':'停用'"/>
注意:state的在Java文件中是一個字符串類型
知識點(3):在異步“發布”和“停用”消息的Javascript和HTML標簽中的id值
Javascript部分
//異步發布信息,信息的id及將要改成的信息狀態 function doPublic(infoId, state){ //1、更新信息狀態 $.ajax({ url:"${basePath}/tax/info_publicInfo.action", data:{"info.infoId":infoId,"info.state":state}, type:"post", success:function(msg){ //2、更新狀態欄、操作攔的顯示值 if("更新狀態成功" == msg){ if(state == 1){//說明信息狀態已經被改成 發布,狀態欄顯示 發布,操作欄顯示 停用 $('#show_'+infoId).html("發布"); $('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',0)">停用</a>'); } else{ $('#show_'+infoId).html("停用"); $('#oper_'+infoId).html('<a href="javascript:doPublic(\''+infoId+'\',1)">發布</a>'); } } else{ alert("更新信息狀態失敗!"); } }, error:function(){ alert("更新信息狀態失敗!"); } }); }
HTML部分
<td id="show_<s:property value='infoId'/>" align="center"><s:property value="state==1?'發布':'停用'"/></td> <td align="center"> <span id="oper_<s:property value="infoId"/>"> <s:if test="state==1"> <a href="javascript:doPublic('<s:property value="infoId" />',0)">停用</a> </s:if> <s:else> <a href="javascript:doPublic('<s:property value="infoId"/>',1)">發布</a> </s:else> </span> <a href="javascript:doEdit('<s:property value='infoId'/>')">編輯</a> <a href="javascript:doDelete('<s:property value='infoId'/>')">刪除</a> </td>
6.2、addUI.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <%@include file="/common/header.jsp"%> <title>信息發布管理</title> <script> </script> </head> <body class="rightBody"> <form id="form" name="form" action="${basePath}/tax/info_add.action" method="post" enctype="multipart/form-data"> <div class="p_d_1"> <div class="p_d_1_1"> <div class="content_info"> <div class="c_crumbs"><div><b></b><strong>信息發布管理</strong> - 新增信息</div></div> <div class="tableH2">新增信息</div> <table id="baseInfo" width="100%" align="center" class="list" border="0" cellpadding="0" cellspacing="0" > <tr> <td class="tdBg" width="200px">信息分類:</td> <td><s:select name="info.type" list="#infoTypeMap"/></td> <td class="tdBg" width="200px">來源:</td> <td><s:textfield name="info.source"/></td> </tr> <tr> <td class="tdBg" width="200px">信息標題:</td> <td colspan="3"><s:textfield name="info.title" cssStyle="width:90%"/></td> </tr> <tr> <td class="tdBg" width="200px">信息內容:</td> <td colspan="3"><s:textarea id="editor" name="info.content" cssStyle="width:90%;height:160px;" /></td> </tr> <tr> <td class="tdBg" width="200px">備注:</td> <td colspan="3"><s:textarea name="info.memo" cols="90" rows="3"/></td> </tr> <tr> <td class="tdBg" width="200px">創建人:</td> <td> <s:property value="#session.SYS_USER.name"/> <s:hidden name="info.creator" value="%{#session.SYS_USER.name}"/> </td> <td class="tdBg" width="200px">創建時間:</td> <td> <s:date name="info.createTime" format="yyyy-MM-dd HH:ss"/> <s:hidden name="info.createTime"/> </td> </tr> </table> <!-- 默認信息狀態為 發布 --> <s:hidden name="info.state" value="1"/> <div class="tc mt20"> <input type="submit" class="btnB2" value="保存" /> <input type="button" onclick="javascript:history.go(-1)" class="btnB2" value="返回" /> </div> </div></div></div> </form> </body> </html>
知識點(1):時間的顯示和隱藏字段
<s:property value="#session.SYS_USER.name"/> <s:hidden name="info.creator" value="%{#session.SYS_USER.name}"/>
注意一點,在使用<s:hidden>時,我使用下面語句是錯誤的,只是因為沒有加%{},因為我認為value中接受的值都是OGNL表達式,但是它沒有正確顯示出來(其實,我認為自己的理解是正確的,至于為什么沒有顯示出來,我不清楚)。
下面是錯誤的寫法:
<s:hidden name="info.creator" value="#session.SYS_USER.name"/>
知識點(2):顯示當前時間和隱藏時間字段
<s:date name="info.createTime" format="yyyy-MM-dd HH:ss"/> <s:hidden name="info.createTime"/>
知識點(3):默認為“發布”狀態
<!-- 默認信息狀態為 發布 --> <s:hidden name="info.state" value="1"/>
6.3、editUI.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <%@include file="/common/header.jsp"%> <title>信息發布管理</title> <script> </script> </head> <body class="rightBody"> <form id="form" name="form" action="${basePath}/tax/info_edit.action" method="post" enctype="multipart/form-data"> <div class="p_d_1"> <div class="p_d_1_1"> <div class="content_info"> <div class="c_crumbs"><div><b></b><strong>信息發布管理</strong> - 修改信息</div></div> <div class="tableH2">修改信息</div> <table id="baseInfo" width="100%" align="center" class="list" border="0" cellpadding="0" cellspacing="0" > <tr> <td class="tdBg" width="200px">信息分類:</td> <td><s:select name="info.type" list="#infoTypeMap"/></td> <td class="tdBg" width="200px">來源:</td> <td><s:textfield name="info.source"/></td> </tr> <tr> <td class="tdBg" width="200px">信息標題:</td> <td colspan="3"><s:textfield name="info.title" cssStyle="width:90%"/></td> </tr> <tr> <td class="tdBg" width="200px">信息內容:</td> <td colspan="3"><s:textarea id="editor" name="info.content" cssStyle="width:90%;height:160px;" /></td> </tr> <tr> <td class="tdBg" width="200px">備注:</td> <td colspan="3"><s:textarea name="info.memo" cols="90" rows="3"/></td> </tr> <tr> <td class="tdBg" width="200px">創建人:</td> <td> <s:property value="info.creator"/> <s:hidden name="info.creator"/> </td> <td class="tdBg" width="200px">創建時間:</td> <td> <s:date name="info.createTime" format="yyyy-MM-dd HH:ss"/> <s:hidden name="info.createTime"/> </td> </tr> </table> <s:hidden name="info.infoId"/> <s:hidden name="info.state"/> <div class="tc mt20"> <input type="submit" class="btnB2" value="保存" /> <input type="button" onclick="javascript:history.go(-1)" class="btnB2" value="返回" /> </div> </div></div></div> </form> </body> </html>
知識點(1):在編輯頁面,要注意隱藏原來的id和數據狀態
<s:hidden name="info.infoId"/> <s:hidden name="info.state"/>
感謝你能夠認真閱讀完這篇文章,希望小編分享的“SSH如何實現信息發布管理”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。