SSH系列:(26)投诉受理

1、Hibernate逆向工程

1.1、CDM概念模型

这里虽然用了T_Complain,但是不建议这样做,因为后面生成JavaBean类时,会生成TComplain.java类,而不是Complain.java。

1.2、物理模型

1.3、生成的实体类和Hibernate映射文件

Complain.java

package com.rk.tax.entity;

import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;
import java.util.Map;
import java.util.HashMap;

/**
 * TComplain entity. @author MyEclipse Persistence Tools
 */

public class Complain implements java.io.Serializable {

	// Fields

	private String compId;
	private String compCompany;
	private String compName;
	private String compMobile;
	private Boolean isAnonymous;
	private Timestamp compTime;
	private String compTitle;
	private String toCompName;
	private String toCompDept;
	private String compContent;
	private String state;
	private Set complainreplies = new HashSet(0);

	//状态
	public static String COMPLAIN_STATE_UNDONE = "0";
	public static String COMPLAIN_STATE_DONE = "1";
	public static String COMPLAIN_STATE_INVALID = "2";
	public static Map<String, String> COMPLAIN_STATE_MAP;
	static {
		COMPLAIN_STATE_MAP = new HashMap<String, String>();
		COMPLAIN_STATE_MAP.put(COMPLAIN_STATE_UNDONE, "待受理");
		COMPLAIN_STATE_MAP.put(COMPLAIN_STATE_DONE, "已受理");
		COMPLAIN_STATE_MAP.put(COMPLAIN_STATE_INVALID, "已失效");
	}

	// Constructors

	/** default constructor */
	public Complain() {
	}

	public String getCompId() {
		return compId;
	}

	public void setCompId(String compId) {
		this.compId = compId;
	}

	public String getCompCompany() {
		return compCompany;
	}

	public void setCompCompany(String compCompany) {
		this.compCompany = compCompany;
	}

	public String getCompName() {
		return compName;
	}

	public void setCompName(String compName) {
		this.compName = compName;
	}

	public String getCompMobile() {
		return compMobile;
	}

	public void setCompMobile(String compMobile) {
		this.compMobile = compMobile;
	}

	public Boolean getIsAnonymous() {
		return isAnonymous;
	}

	public void setIsAnonymous(Boolean isAnonymous) {
		this.isAnonymous = isAnonymous;
	}

	public Timestamp getCompTime() {
		return compTime;
	}

	public void setCompTime(Timestamp compTime) {
		this.compTime = compTime;
	}

	public String getCompTitle() {
		return compTitle;
	}

	public void setCompTitle(String compTitle) {
		this.compTitle = compTitle;
	}

	public String getToCompName() {
		return toCompName;
	}

	public void setToCompName(String toCompName) {
		this.toCompName = toCompName;
	}

	public String getToCompDept() {
		return toCompDept;
	}

	public void setToCompDept(String toCompDept) {
		this.toCompDept = toCompDept;
	}

	public String getCompContent() {
		return compContent;
	}

	public void setCompContent(String compContent) {
		this.compContent = compContent;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public Set getComplainreplies() {
		return complainreplies;
	}

	public void setComplainreplies(Set complainreplies) {
		this.complainreplies = complainreplies;
	}

}

知识点(1)

	//状态
	public static String COMPLAIN_STATE_UNDONE = "0";
	public static String COMPLAIN_STATE_DONE = "1";
	public static String COMPLAIN_STATE_INVALID = "2";
	public static Map<String, String> COMPLAIN_STATE_MAP;
	static {
		COMPLAIN_STATE_MAP = new HashMap<String, String>();
		COMPLAIN_STATE_MAP.put(COMPLAIN_STATE_UNDONE, "待受理");
		COMPLAIN_STATE_MAP.put(COMPLAIN_STATE_DONE, "已受理");
		COMPLAIN_STATE_MAP.put(COMPLAIN_STATE_INVALID, "已失效");
	}

Complain.hbm.xml

注意:在生成的映射文件中去掉 catalog=”数据库名称”。

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.rk.tax.entity.Complain" table="t_complain">
        <id name="compId" type="java.lang.String">
            <column name="comp_id" length="32" />
            <generator class="uuid.hex" />
        </id>
        <property name="compCompany" type="java.lang.String">
            <column name="comp_company" length="100" />
        </property>
        <property name="compName" type="java.lang.String">
            <column name="comp_name" length="20" />
        </property>
        <property name="compMobile" type="java.lang.String">
            <column name="comp_mobile" length="20" />
        </property>
        <property name="isAnonymous" type="java.lang.Boolean">
            <column name="is_anonymous" />
        </property>
        <property name="compTime" type="java.sql.Timestamp">
            <column name="comp_time" length="19" />
        </property>
        <property name="compTitle" type="java.lang.String">
            <column name="comp_title" length="200" not-null="true" />
        </property>
        <property name="toCompName" type="java.lang.String">
            <column name="to_comp_name" length="32" />
        </property>
        <property name="toCompDept" type="java.lang.String">
            <column name="to_comp_dept" length="100" />
        </property>
        <property name="compContent" type="text">
            <column name="comp_content"/>
        </property>
        <property name="state" type="java.lang.String">
            <column name="state" length="1" />
        </property>
        <set name="complainreplies" inverse="true" lazy="false" cascade="save-update" order-by="reply_time">
            <key>
                <column name="comp_id" length="32" not-null="true" />
            </key>
            <one-to-many class="com.rk.tax.entity.Complainreply" />
        </set>
    </class>
</hibernate-mapping>

知识点(1):

        <property name="isAnonymous" type="java.lang.Boolean">
            <column name="is_anonymous" />
        </property>

知识点(2):

        <property name="compTime" type="java.sql.Timestamp">
            <column name="comp_time" length="19" />
        </property>

知识点(3):

        <property name="compContent" type="text">
            <column name="comp_content"/>
        </property>

对应的类字段

	private Boolean isAnonymous;
	private Timestamp compTime;
	private String compContent;

知识点(4):

        <set name="complainreplies" inverse="true" lazy="false" cascade="save-update" order-by="reply_time">
            <key>
                <column name="comp_id" length="32" not-null="true" />
            </key>
            <one-to-many class="com.rk.tax.entity.Complainreply" />
        </set>

其中

lazy="false" cascade="save-update" order-by="reply_time"

lazy="false"表示不使用懒加载,

cascade="save-update"表示级联保存、更新

order-by="reply-time"是指取出的数据按照reply-time排序。注意:reply_time是数据库的列的名称,这里也可以类的字段replyTime,但是类的字段replyTime与数据库的列名reply_time相比,类的字段replyTime可能在某些版本中存在问题,而数据库的列名reply_time更具有通用性。

Complainreply.java

package com.rk.tax.entity;

import java.sql.Timestamp;

/**
 * TComplainreply entity. @author MyEclipse Persistence Tools
 */

public class Complainreply implements java.io.Serializable {

	// Fields

	private String replyId;
	private Complain complain;
	private String replyer;
	private String replyDept;
	private Timestamp replyTime;
	private String replyContent;

	// Constructors

	/** default constructor */
	public Complainreply() {
	}

	/** minimal constructor */
	public Complainreply(Complain complain) {
		this.complain = complain;
	}

	/** full constructor */
	public Complainreply(Complain complain, String replyer,
			String replyDept, Timestamp replyTime, String replyContent) {
		this.complain = complain;
		this.replyer = replyer;
		this.replyDept = replyDept;
		this.replyTime = replyTime;
		this.replyContent = replyContent;
	}

	public String getReplyId() {
		return replyId;
	}

	public void setReplyId(String replyId) {
		this.replyId = replyId;
	}

	public Complain getComplain() {
		return complain;
	}

	public void setComplain(Complain complain) {
		this.complain = complain;
	}

	public String getReplyer() {
		return replyer;
	}

	public void setReplyer(String replyer) {
		this.replyer = replyer;
	}

	public String getReplyDept() {
		return replyDept;
	}

	public void setReplyDept(String replyDept) {
		this.replyDept = replyDept;
	}

	public Timestamp getReplyTime() {
		return replyTime;
	}

	public void setReplyTime(Timestamp replyTime) {
		this.replyTime = replyTime;
	}

	public String getReplyContent() {
		return replyContent;
	}

	public void setReplyContent(String replyContent) {
		this.replyContent = replyContent;
	}

}

Complainreply.hbm.xml

注意:在生成的映射文件中去掉 catalog=”数据库名称”。

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.rk.tax.entity.Complainreply" table="t_complainreply">
        <id name="replyId" type="java.lang.String">
            <column name="reply_id" length="32" />
            <generator class="uuid.hex" />
        </id>
        <many-to-one name="complain" class="com.rk.tax.entity.Complain" fetch="select">
            <column name="comp_id" length="32" not-null="true" />
        </many-to-one>
        <property name="replyer" type="java.lang.String">
            <column name="replyer" length="20" />
        </property>
        <property name="replyDept" type="java.lang.String">
            <column name="reply_dept" length="100" />
        </property>
        <property name="replyTime" type="java.sql.Timestamp">
            <column name="reply_time" length="19" />
        </property>
        <property name="replyContent" type="java.lang.String">
            <column name="reply_content" length="300" />
        </property>
    </class>
</hibernate-mapping>

2、从dao到action

dao->service->action->config

2.1、dao层

ComplainDao.java

package com.rk.tax.dao;

import com.rk.core.dao.BaseDao;
import com.rk.tax.entity.Complain;

public interface ComplainDao extends BaseDao<Complain> {

}

ComplainDaoImpl.java

package com.rk.tax.dao.impl;

import com.rk.core.dao.impl.BaseDaoImpl;
import com.rk.tax.dao.ComplainDao;
import com.rk.tax.entity.Complain;

public class ComplainDaoImpl extends BaseDaoImpl<Complain> implements ComplainDao {

}

2.2、service层

ComplainService.java

package com.rk.tax.service;

import com.rk.core.service.BaseService;
import com.rk.tax.entity.Complain;

public interface ComplainService extends BaseService<Complain> {

}

ComplainServiceImpl.java

package com.rk.tax.service.impl;

import java.util.Calendar;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.rk.core.service.Impl.BaseServiceImpl;
import com.rk.core.utils.QueryHelper;
import com.rk.tax.dao.ComplainDao;
import com.rk.tax.entity.Complain;
import com.rk.tax.service.ComplainService;

@Service("complainService")
public class ComplainServiceImpl extends BaseServiceImpl<Complain> implements ComplainService {
	private ComplainDao complainDao;
	@Resource
	public void setComplainDao(ComplainDao complainDao) {
		setBaseDao(complainDao);
		this.complainDao = complainDao;
	}

}

2.3、action层

ComplainAction.java

package com.rk.tax.action;

import java.net.URLDecoder;
import java.sql.Timestamp;
import java.util.Date;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
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.core.utils.QueryHelper;
import com.rk.tax.entity.Complain;
import com.rk.tax.entity.Complainreply;
import com.rk.tax.service.ComplainService;

@Controller("complainAction")
@Scope("prototype")
public class ComplainAction extends BaseAction {
	/*****1、业务数据*****/
	private Complain complain;
	private String startTime;
	private String endTime;
	private String state;
	private Complainreply reply;
	/*****2、业务实现类*****/
	@Resource
	private ComplainService complainService;

	/*****3、响应页面操作*****/
	//列表
	public String listUI(){
		//加载状态集合
		ActionContext.getContext().getContextMap().put("complainStateMap", Complain.COMPLAIN_STATE_MAP);
		try {
			QueryHelper queryHelper = new QueryHelper(Complain.class, "c");
			if(StringUtils.isNotBlank(startTime)){//查询开始时间之后的投诉数据
				startTime = URLDecoder.decode(startTime, "utf-8");
				queryHelper.addCondition("c.compTime >= ?", DateUtils.parseDate(startTime+":00", "yyyy-MM-dd HH:mm:ss"));
			}
			if(StringUtils.isNotBlank(endTime)){//查询结束时间之前的投诉数据
				endTime = URLDecoder.decode(endTime, "utf-8");
				queryHelper.addCondition("c.compTime <= ?", DateUtils.parseDate(endTime+":00", "yyyy-MM-dd HH:mm:ss"));
			}
			if(StringUtils.isNotBlank(searchContent)){
				searchContent = URLDecoder.decode(searchContent, "utf-8");
				queryHelper.addCondition("c.compTitle like ?", "%" + searchContent + "%");
			}
			if(StringUtils.isNotBlank(state)){
				queryHelper.addCondition("c.state=?", state);
			}
			//按照状态升序排序
			queryHelper.addOrderByProperty("c.state", QueryHelper.ORDER_BY_ASC);
			//按照投诉时间升序排序
			queryHelper.addOrderByProperty("c.compTime", QueryHelper.ORDER_BY_ASC);
			pageResult = complainService.getPageResult(queryHelper, pageNo, pageSize);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "listUI";
	}

	//跳转到受理页面
	public String dealUI(){
		//加载状态集合
		ActionContext.getContext().getContextMap().put("complainStateMap", Complain.COMPLAIN_STATE_MAP);
		if(complain != null && StringUtils.isNotBlank(complain.getCompId())){
			complain = complainService.findById(complain.getCompId());
		}
		return "dealUI";
	}

	public String deal(){
		if(complain != null && StringUtils.isNotBlank(complain.getCompId())){
			Complain temp = complainService.findById(complain.getCompId());
			//1、更新投诉的状态为 已受理
			if(!Complain.COMPLAIN_STATE_DONE.equals(temp.getState())){
				temp.setState(Complain.COMPLAIN_STATE_DONE);
			}
			//2、保存回复信息
			if(reply != null){
				reply.setComplain(temp);
				/**
				 * 在后台设置时间,有两点好处:
				 * (1)在前台JSP页面,不需要再提供相应的表单域
				 * (2)有两个时间:JSP前台页面生成的时间、服务器保存数据的时间,后者更准确一些
				 */
				reply.setReplyTime(new Timestamp(new Date().getTime())); 
				temp.getComplainreplies().add(reply);
			}
			complainService.update(temp);
		}
		return "list";
	}

	// Properties
	public Complain getComplain() {
		return complain;
	}
	public void setComplain(Complain complain) {
		this.complain = complain;
	}
	public String getStartTime() {
		return startTime;
	}
	public void setStartTime(String startTime) {
		this.startTime = startTime;
	}
	public String getEndTime() {
		return endTime;
	}
	public void setEndTime(String endTime) {
		this.endTime = endTime;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public Complainreply getReply() {
		return reply;
	}
	public void setReply(Complainreply reply) {
		this.reply = reply;
	}
}

知识点(1):级联 保存、更新

在deal()方法中

			Complain temp = complainService.findById(complain.getCompId());
			//1、更新投诉的状态为 已受理
			if(!Complain.COMPLAIN_STATE_DONE.equals(temp.getState())){
				temp.setState(Complain.COMPLAIN_STATE_DONE);
			}
			//2、保存回复信息
			if(reply != null){
				reply.setComplain(temp);
				/**
				 * 在后台设置时间,有两点好处:
				 * (1)在前台JSP页面,不需要再提供相应的表单域
				 * (2)有两个时间:JSP前台页面生成的时间、服务器保存数据的时间,后者更准确一些
				 */
				reply.setReplyTime(new Timestamp(new Date().getTime())); 
				temp.getComplainreplies().add(reply);
			}
			complainService.update(temp);

最后只调用complainService.update(temp),而temp是Complain类型的变量,而真正想要保存的的reply变量,这是通过级联保存(更新)实现的,Complain.hbm.xml中设置了cascade="save-update"

        <set name="complainreplies" inverse="true" lazy="false" cascade="save-update" order-by="reply_time">
            <key>
                <column name="comp_id" length="32" not-null="true" />
            </key>
            <one-to-many class="com.rk.tax.entity.Complainreply" />
        </set>

2.4、config

entity层的配置就是*.hbm.xml文件

dao层的配置是将dao类加入到Spring的IOC容器中

service层的配置是将service类加入到Spring的IOC容器中

action层的配置是将action类加入到Spring的IOC容器中,并在struts中对action进行url映射

最后记得将spring和struts的配置都汇总到applicationContext.xml和struts.xml文件中

3、JSP页面

listUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>投诉受理管理</title>
    <script type="text/javascript" src="${basePath}/js/datepicker/WdatePicker.js"></script>
    <script type="text/javascript">
    	var list_url = "${basePath}/tax/complain_listUI.action";
    	function doAnnualStatistic(){
    		// TODO
    	}
    	function doDeal(id){
    		document.forms[0].action = "${basePath}/tax/complain_dealUI.action?complain.compId="+id;
    		document.forms[0].submit();
    	}
    </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="searchContent" cssClass="s_text"  cssStyle="width:160px;"/>
                    </li>
                    <li>
                       	投诉时间:<s:textfield id="startTime" name="startTime" cssClass="s_text"  cssStyle="width:160px;" readonly="true"
                       						onfocus="WdatePicker({‘skin‘:‘whyGreen‘,‘dateFmt‘:‘yyyy-MM-dd HH:mm‘})"/>
                              - 
                             <s:textfield id="endTime" name="endTime" cssClass="s_text"  cssStyle="width:160px;" readonly="true"
                       						onfocus="WdatePicker({‘skin‘:‘whyGreen‘,‘dateFmt‘:‘yyyy-MM-dd HH:mm‘})"/>
                    </li>
                    <li>
                       	状态:<s:select name="state" list="#complainStateMap" headerKey="" headerValue="全部"/>
                    </li>
                    <li><input type="button" class="s_button" value="搜 索" onclick="doSearch()"/></li>
                    <li style="float:right;">
                    	<input type="button" value="统计" class="s_button" onclick="doAnnualStatistic()"/>&nbsp;
                    </li>

                </div>

                <div class="t_list" style="margin:0px; border:0px none;">
                    <table width="100%" border="0">
                        <tr class="t_tit">
                            <td align="center">投诉标题</td>
                            <td width="120" align="center">被投诉部门</td>
                            <td width="120" align="center">被投诉人</td>
                            <td width="140" align="center">投诉时间</td>
                            <td width="100" align="center">受理状态</td>
                            <td width="100" align="center">操作</td>
                        </tr>
                       <s:iterator value="pageResult.items" status="st">
                            <tr <s:if test="#st.odd"> bgcolor="f8f8f8" </s:if> >
                                <td align="center"><s:property value="compTitle"/></td>
                                <td align="center"><s:property value="toCompDept"/></td>
                                <td align="center"><s:property value="toCompName"/></td>
                                <td align="center"><s:date name="compTime" format="yyyy-MM-dd HH:mm"/></td>
                                <td align="center"><s:property value="#complainStateMap[state]"/></td>
                                <td align="center">
                                    <a href="javascript:doDeal(‘<s:property value=‘compId‘/>‘)">受理</a>
                                </td>
                            </tr>
                        </s:iterator>
                    </table>
                </div>
            </div>

        <%@include file="/common/pageNavigator.jsp" %>

        </div>
    </div>
</form>

</body>
</html>

知识点(1):WDatePicker

<script type="text/javascript" src="${basePath}/js/datepicker/WdatePicker.js"></script>
<s:textfield id="startTime" name="startTime" cssClass="s_text"  cssStyle="width:160px;" readonly="true"
     onfocus="WdatePicker({‘skin‘:‘whyGreen‘,‘dateFmt‘:‘yyyy-MM-dd HH:mm‘})"/>

知识点(2):<s:select>

<s:select name="state" list="#complainStateMap" headerKey="" headerValue="全部"/>

dealUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>投诉受理管理</title>
</head>
<body class="rightBody">
<form id="form" name="form" action="${basePath}/tax/complain_deal.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>&nbsp;-&nbsp;投诉受理</div></div>
    <div class="tableH2">投诉详细信息<span style="color:red;">(已受理)</span></div>
    <table id="baseInfo" width="100%" align="center" class="list" border="0" cellpadding="0" cellspacing="0"  >
    	<tr><td colspan="2" align="center">投诉人信息</td></tr>
        <tr>
            <td class="tdBg" width="250px">是否匿名投诉:</td>
            <td><s:property value="complain.isAnonymous?‘匿名投诉‘:‘非匿名投诉‘"/></td>
        </tr>
        <tr>
            <td class="tdBg">投诉人单位:</td>
            <td>
            	<s:if test="!complain.isAnonymous">
            		<s:property value="complain.compCompany"/>
            	</s:if>
            </td>
        </tr>
        <tr>
            <td class="tdBg">投诉人姓名:</td>
            <td>
				<s:if test="!complain.isAnonymous">
            		<s:property value="complain.compName"/>
            	</s:if>
			</td>
        </tr>
        <tr>
            <td class="tdBg">投诉人手机:</td>
            <td>
            	<s:if test="!complain.isAnonymous">
            		<s:property value="complain.compMobile"/>
            	</s:if>
            	<s:elseif test="complain.compMobile.length() > 10">
            		<s:property value="complain.compMobile.substring(0,3) + ‘****‘ + complain.compMobile.substring(7,11)"/>
            	</s:elseif>
            	<s:else>
            		<s:property value="complain.compMobile"/>
            	</s:else>
            </td>
        </tr>
        <tr><td colspan="2" align="center">投诉信息</td></tr>
        <tr>
            <td class="tdBg">投诉时间:</td>
            <td>
            	<s:date name="complain.compTime" format="yyyy-MM-dd HH:mm"/>
            </td>
        </tr>
        <tr>
            <td class="tdBg">被投诉部门:</td>
            <td><s:property value="complain.toCompDept"/></td>
        </tr>
        <tr>
            <td class="tdBg">被投诉人:</td>
            <td><s:property value="complain.toCompName"/></td>
        </tr>
        <tr>
            <td class="tdBg">投诉标题:</td>
            <td><s:property value="complain.compTitle"/></td>
        </tr>
        <tr>
            <td class="tdBg">投诉内容:</td>
            <td><s:property value="complain.compContent" escape="false"/></td>
        </tr>
        <tr><td colspan="2" align="center">受理信息</td></tr>
        <tr>
            <td colspan="2">
            	<s:iterator value="complain.complainreplies" status="st">
            		<fieldset style="border: solid 1px #c0c0c0;margin-top:5px;"><legend style="color:green;font-weight:bold;">回复<s:property value="#st.count"/>&nbsp;</legend>
						<div style="width:100%; text-align:center;color:#ccc;maring-top:5px;">
						回复部门:<s:property value="replyDept"/> &nbsp;&nbsp;
						回复人:<s:property value="replyer"/>&nbsp;&nbsp;
						回复时间:<s:date name="replyTime" format="yyyy-MM-dd HH:mm"/>
						</div>
						<div style="width:100%;maring-top:10px;font-size:13px;padding-left:5px;">
							<s:property value="replyContent"/>
						</div>
					</fieldset>
            	</s:iterator>
            </td>
        </tr>
        <tr><td colspan="2" align="center">受理操作</td></tr>
        <tr>
            <td class="tdBg">回复部门:</td>
            <td>
	            <s:property value="#session.SYS_USER.dept"/>
	            <s:hidden name="reply.replyDept" value="%{#session.SYS_USER.dept}"/>
            </td>
        </tr>
        <tr>
            <td class="tdBg">回复人:</td>
            <td>
            	<s:property value="#session.SYS_USER.name"/>
            	<s:hidden name="reply.replyer" value="%{#session.SYS_USER.name}"/>
            </td>
        </tr>

        <tr>
            <td class="tdBg" width="200px">回复内容:</td>
            <td><s:textarea name="reply.replyContent" cols="90" rows="8" /></td>
        </tr>
    </table>
    <s:hidden name="complain.compId"/>
    <div class="tc mt20">
        <input type="submit" class="btnB2" value="保存" />
        &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="button"  onclick="javascript:history.go(-1)" class="btnB2" value="返回" />
    </div>
    </div></div></div>
</form>
</body>
</html>

知识点(1):OGNL字符中长度判断 和 拼接

<s:elseif test="complain.compMobile.length() > 10">
	<s:property value="complain.compMobile.substring(0,3) + ‘****‘ + complain.compMobile.substring(7,11)"/>
</s:elseif>

知识点(2):<s:date>

<s:date name="complain.compTime" format="yyyy-MM-dd HH:mm"/>

知识点(3):<s:property>和<s:hidden> 似乎对OGNL的支持不同

<s:property value="#session.SYS_USER.name"/>
<s:hidden name="reply.replyer" value="%{#session.SYS_USER.name}"/>
时间: 2024-11-08 23:16:14

SSH系列:(26)投诉受理的相关文章

【SSH项目实战】国税协同平台-28.投诉受理需求分析&amp;CDM&amp;PDM

我们接下来编写"投诉受理"模块的功能. 首先进行需求分析,我们来看一下我们的需求: 界面描述: 2.7.2功能说明 (1)投诉受理管理:查询用户提交的投诉信息,可以根据投诉部门(部门A/B).投诉时间段.状态进行查询.在列表信息中展示投诉标题.被投诉部门.被投诉人.投诉时间.状态(待受理.已受理.已失效).操作:其中操作栏内内容为"处理",点击"处理"则在打开的查询页面中查看具体的投诉信息并且可以多次回复投诉信息:一旦回复则说明已受理该投诉. (

SSH系列:(27)添加投诉

在工作主页中的"我要投诉",点击后弹出,投诉的新增页面,保存后到投诉受理后台管理进行处理.在这边添加时候需要使用到Ajax根据部门名称级联查询部门人员:查询到部门对应的人员列表后,需要将这些人员信息转换为json字符串. 1.HomeAction (1)按照讲义中写的应该是引入3个jar,分别是: commons-beanutils-1.8.0.jar ezmorph-1.0.6.jar json-lib-2.3-jdk15.jar 我猜测,是为了进行JSON转换,但我写代码并没有成功

【SSH系列】静态代理&amp;&amp;动态代理

从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: a.抽象角色:通过接口或抽象类声明真实角色实现的业务方法. b.代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. c.真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.第一次接触代理模式的是在学习大话设计模式的时候,首先

姐妹们春季纯天然除暗沉面膜大全系列26

面膜护肤告示:DIY的绿豆面膜都很好用,也平民实惠实用,每款自制的面膜,是要按照你的肤质来选择的,不妨用时间去慢慢尝试,并且在尝试中找寻最适合您肤质的面膜,·····下文介绍一些面膜的配置方法和配料,敷脸的具体方法很简单,基本上都是直接搅成泥浆或是捣碎等方法,然后直接敷于脸部,就ok了!    清洁面膜之     西瓜皮面膜--每周两次.可使皮肤细嫩白净. .txt    去角质面膜之   盐(一小勺)蛋清面膜.      滋养面膜之自制滋养面膜3 .txt    保湿面膜之    胡萝卜.蛋黄

redis 系列26 Cluster高可用 (1)

原文:redis 系列26 Cluster高可用 (1) 一.概述 Redis集群提供了分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能.在大数据量方面的高可用方案,cluster集群比Sentinel有优势.但Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.学习集群同样先了解一些原理方面包括:节点.槽指派.命令执行.重新分片,转向.故障转移.消息.后面再操作集群演示.

SSH系列:(29)使用Quartz 实现自动受理

需求中要求每月月底将上个月的投诉自动处理为已失效.要求是每月月底,所以定时任务应该将处理时间设置在每月的月底:处理的任务是将上个月的未受理的投诉信息自动将其状态设置为已失效. 将自动受理的方法加入到complainService/complainServiceImpl中,以便事务控制: ComplainService.java package com.rk.tax.service; import com.rk.core.service.BaseService; import com.rk.tax

SSH系列:(32)年度投诉数统计

1.JSP页面 annualStatisticChartUI.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% Calendar cal = Calendar.getInstance(); int curYear = cal.get(Calendar.YEAR);//当前年份 request.setAttribute("

《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7  在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ查询,使用了类似这样的操作 group by,join,和where:你想使用Include()方法预先加载额外的实体.另外你想使用Code-First来管理数据访问. 解决方案 假设你有如图5-22所示的概念模型 图5-22 一个简单的包含Club和Event以及它们之间一对多关联的模型 在Visual S

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射. 在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之间的关系就是多对多,多对多关联