这篇文章主要介绍了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 {
private List<Info> infoList;
private Info info;
@Resource
private InfoService infoService;
//列表页面
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如何实现信息发布管理”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!