这篇文章主要介绍了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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。