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转换,但我写代码并没有成功

	public void getUserJson(){
		try {
			//1、获取部门
			String dept = ServletActionContext.getRequest().getParameter("dept");
			if(StringUtils.isNotBlank(dept)){
				QueryHelper queryHelper = new QueryHelper(User.class, "u");
				queryHelper.addCondition("u.dept like ?", "%" + dept);
				//2、根据部门查询用户列表
				List<User> userList = userService.findObjects(queryHelper);
				//创建Json对象
				JSONObject jso = new JSONObject();
				jso.put("msg", "success");
				jso.accumulate("userList", userList);

				//3、输出用户列表以json格式字符串形式输出
				HttpServletResponse response = ServletActionContext.getResponse();
				response.setContentType("text/html");
				ServletOutputStream outputStream = response.getOutputStream();
				outputStream.write(jso.toString().getBytes("utf-8"));
				outputStream.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

之后,我只能用gson来完成,当我想删除添加之前添加的jar包时,却无法删除,因此也没有办法判断这几个jar包对JSON字符串的功能

(2)使用struts2-json-plugin-2.x.jar 包,由struts将action中的变量组装成Json对象。

HomeAction.java

package com.rk.home.action;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.rk.core.entity.JsonResult;
import com.rk.core.utils.QueryHelper;
import com.rk.tax.entity.Complain;
import com.rk.tax.entity.User;
import com.rk.tax.service.ComplainService;
import com.rk.tax.service.UserService;

public class HomeAction extends ActionSupport {

	private Map<String, Object> return_map;
	private Complain comp;
	@Resource
	private UserService userService;
	@Resource
	private ComplainService complainService;

	//跳转到首页
	@Override
	public String execute() throws Exception {
		return "home";
	}

	//跳转到我要投诉
	public String complainAddUI(){
		return "complainAddUI";
	}

	public void getUserJson(){
		try {
			//1、获取部门
			String dept = ServletActionContext.getRequest().getParameter("dept");
			if(StringUtils.isNotBlank(dept)){
				QueryHelper queryHelper = new QueryHelper(User.class, "u");
				queryHelper.addCondition("u.dept like ?", "%"+dept); // FIXME 这里为什么是%+dept呢?
				//2、根据部门查询用户列表
				List<User> userList = userService.findList(queryHelper);
				//创建Json对象
				JsonResult result = new JsonResult();
				result.setStatus(JsonResult.SUCCESS);
				result.setData(userList);
				Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
				String strJson = gson.toJson(result);

				//3、输出用户列表,以JSON格式字符串形式输出
				HttpServletResponse response = ServletActionContext.getResponse();
				response.setContentType("text/html");
				ServletOutputStream outputStream = response.getOutputStream();
				outputStream.write(strJson.getBytes("utf-8"));
				outputStream.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String getUserJson2(){
		//1、获取部门
		String dept = ServletActionContext.getRequest().getParameter("dept");
		if(StringUtils.isNotBlank(dept)){
			QueryHelper queryHelper = new QueryHelper(User.class, "u");
			queryHelper.addCondition("u.dept like ?", "%"+dept);
			//2、根据部门查询用户列表
			return_map = new HashMap<String, Object>();
			return_map.put("status", "success");
			return_map.put("data", userService.findList(queryHelper));
		}
		return Action.SUCCESS;
	}

	//保存投诉
	public void complainAdd(){
		try {
			if(comp != null){
				//设置默写投诉状态为 待受理
				comp.setState(Complain.COMPLAIN_STATE_UNDONE);
				comp.setCompTime(new Timestamp(new Date().getTime()));
				complainService.save(comp);

				//输出投诉结果
				HttpServletResponse response = ServletActionContext.getResponse();
				response.setContentType("text/html");
				ServletOutputStream outputStream = response.getOutputStream();
				outputStream.write("success".getBytes("utf-8"));
				outputStream.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Map<String, Object> getReturn_map() {
		return return_map;
	}

	public void setReturn_map(Map<String, Object> return_map) {
		this.return_map = return_map;
	}
	public Complain getComp() {
		return comp;
	}

	public void setComp(Complain comp) {
		this.comp = comp;
	}
}

JsonResult.java

package com.rk.core.entity;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonResult {
	private String status;
	private Object data;

	public static final String OK = "ok";
	public static final String SUCCESS = "success";
	public static final String ERROR = "error";

	public String getStatus()
	{
		return status;
	}
	public void setStatus(String status)
	{
		this.status = status;
	}
	public Object getData()
	{
		return data;
	}
	public void setData(Object data)
	{
		this.data = data;
	}
	@Override
	public String toString()
	{
		//Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
		Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
		return gson.toJson(this);
	}
}

struts-home.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<package name="home_package" namespace="/sys" extends="base-default">
		<action name="home_*" class="com.rk.home.action.HomeAction" method="{1}">
			<result name="home">/WEB-INF/jsp/home/home.jsp</result>
			<result name="{1}">/WEB-INF/jsp/home/{1}.jsp</result>
		</action>
		<action name="login_*" class="loginAction" method="{1}">
			<result name="{1}">/WEB-INF/jsp/{1}.jsp</result>
			<result name="loginUI">/WEB-INF/jsp/loginUI.jsp</result>
			<result name="noPermissionUI">/WEB-INF/jsp/noPermissionUI.jsp</result>
			<result name="home" type="redirectAction">
				<param name="actionName">home</param>
			</result>
			<result name="toLoginUI" type="redirectAction">
				<param name="actionName">toLoginUI</param>
			</result>
		</action>
	</package>
	<package name="sysHomeJson-action" namespace="/sys" extends="json-default">
		<action name="home_getUserJson2" class="com.rk.home.action.HomeAction" method="getUserJson2">
			<result type="json">
				<param name="root">return_map</param>
			</result>
		</action>
	</package>
</struts>

知识点(1):json-default

struts2-json-plugin-2.3.29.jar内有一个struts-plugin.xml文件

在struts-plugin.xml文件中定义了json-default,而它继承自struts-default包。struts-plugin.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="json-default" extends="struts-default">

        <result-types>
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
            <result-type name="jsonActionRedirect" class="org.apache.struts2.json.JSONActionRedirectResult"/>
        </result-types>

        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
            <interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/>

            <!-- Sample JSON validation stack -->
            <interceptor-stack name="jsonValidationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel</param>
                </interceptor-ref>
                <interceptor-ref name="jsonValidation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

        </interceptors>

    </package>
</struts>

注意:<pagekage>中的extends="base-default",如果有多个,中间可以用“,”分隔。

<package name=""  extends="json-default,struts-default">

这样的继承,要确保父包里面不能有重复的 action名,要不然,子包不知道 调用那个。

2、JSP页面

在主页面home.jsp中添加链接,会在空白页面打开

<s:a action="home_complainAddUI" namespace="/sys" target="_blank">我要投诉</s:a>

complainAddUI.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/ueditor/ueditor.config.js"></script>
    <script type="text/javascript" src="${basePath}/js/ueditor/ueditor.all.js"></script>
    <script type="text/javascript" src="${basePath}/js/ueditor/lang/zh-cn/zh-cn.js"></script>
    <script type="text/javascript">
	    window.UEDITOR_HOME_URL = "${basePath}/js/ueditor";
	    window.onload = function(){
	        var ue = UE.getEditor("editor");
	    }
	    //根据部门查询该部门下的用户列表
	   function doSelectDept(){
	    	//1、获取部门
	    	var dept = $(‘#toCompDept option:selected‘).val();
	    	if(dept != ""){
	    		//2、根据部门查询列表
	    		$.ajax({
	    			url:"${basePath}/sys/home_getUserJson2.action",
	    			data:{"dept":dept},
	    			type:"post",
	    			dataType:"json",//返回数据类型
	    			success:function(result){
	    				//2.1、将用户列表设置到被投诉人下拉框中
	    				if(result != null && result != "" && result != undefined){
	    					if("success" == result.status){
	    						var toCompName = $(‘#toCompName‘);
	    						toCompName.empty();
	    						$.each(result.data,function(index,user){
	    							toCompName.append("<option value=‘" + user.name + "‘>"+user.name+"</option>");
	    						});
	    					}
	    					else{
	    						alert("获取被投诉人列表失败");
	    					}
	    				}
	    				else{
	    					alert("被投诉人列表似乎不存在");
	    				}
	    			},
	    			error:function(){
	    				alert("获取被投诉人列表:AJAX请求失败!");
	    			}
	    		});
	    	}
	    	else{
	    		//清空被投诉人列表下拉框
	    		$(‘#toCompName‘).empty();
	    	}
	    }
	    //提交表单
	   function doSubmit(){
			//1、提交表单并保存
			$.ajax({
				url:"${basePath}/sys/home_complainAdd.action",
				data:$(‘#form‘).serialize(),
				type:"post",
				ansy:false,
				success:function(result){
					if(result == "success"){
						//2、提示用户投诉成功
						alert("投诉成功!");
						//3、刷新父窗口
						window.opener.parent.location.reload(true);
						//4、关闭当前窗口
						window.close();
					}
					else{
						alert("投诉失败!");
					}
				},
				error:function(){
					alert("投诉:AJAX请求失败");
				}
			});
	    }
    </script>
</head>
<body>
<form id="form" name="form" action="" method="post" enctype="multipart/form-data">
    <div class="vp_d_1">
        <div style="width:1%;float:left;">&nbsp;&nbsp;&nbsp;&nbsp;</div>
        <div class="vp_d_1_1">
            <div class="content_info">
    <div class="c_crumbs"><div><b></b><strong>工作主页</strong>&nbsp;-&nbsp;我要投诉</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="250px">投诉标题:</td>
            <td><s:textfield name="comp.compTitle"/></td>
        </tr>
        <tr>
            <td class="tdBg">被投诉人部门:</td>
            <td>
            	<s:select id="toCompDept" name="user.dept" list="#{‘‘:‘请选择‘,‘部门A‘:‘部门A‘,‘部门B‘:‘部门B‘}" 
            		onchange="doSelectDept()"></s:select>
            </td>
        </tr>
        <tr>
            <td class="tdBg">被投诉人姓名:</td>
            <td>
            	<select id="toCompName" name="comp.toCompName">
            	</select>
            </td>
        </tr>
        <tr>
            <td class="tdBg">投诉内容:</td>
            <td><s:textarea id="editor" name="comp.compContent" cssStyle="width:90%;height:160px;" /></td>
        </tr>
        <tr>
            <td class="tdBg">是否匿名投诉:</td>
            <td><s:radio name="comp.isAnonymous" list="#{‘false‘:‘非匿名投诉‘,‘true‘:‘匿名投诉‘ }" value="true"/></td>
        </tr>
       
    </table>
	<s:hidden name="comp.compCompany" value="%{#session.SYS_USER.dept}"/>
	<s:hidden name="comp.compName" value="%{#session.SYS_USER.name}"/>
	<s:hidden name="comp.compMobile" value="%{#session.SYS_USER.mobile}"/>
    <div class="tc mt20">
        <input type="button" class="btnB2" value="保存"  onclick="doSubmit()"/>
        &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="button"  onclick="javascript:window.close()" class="btnB2" value="关闭" />
    </div>
    </div></div>
    <div style="width:1%;float:left;">&nbsp;&nbsp;&nbsp;&nbsp;</div>
    </div>
</form>
</body>
</html>

知识点(1):获取select的值

var dept = $(‘#toCompDept option:selected‘).val();

知识点(2):清空、迭代

var toCompName = $(‘#toCompName‘);
toCompName.empty();
$.each(result.data,function(index,user){
	toCompName.append("<option value=‘" + user.name + "‘>"+user.name+"</option>");
});

知识点(3):原窗口的刷新

window.opener.parent.location.reload(true);

知识点(4):表单元素的序列化

$(‘#form‘).serialize()
时间: 2024-08-28 09:40:50

SSH系列:(27)添加投诉的相关文章

redis 系列27 Cluster高可用 (2)

原文:redis 系列27 Cluster高可用 (2) 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可以会出现该槽中的一部分键值对保存在源节点中,另一部份键值对则保存在目标节点中. 当客户端向源节点发送一个与数据库键有关的命令时,并且命令要处理的数据库键正好就是正在被迁移的槽时,会出现二种情况的一种: (1) 源节点会先在自己的数据库中查找指定的键,如果找到的话,就会直接执行客户端

[Android系列—] 4. 添加操作栏(Action Bar)

前言 操作栏是最重要的设计元素之一,使用它来实现你的应用程序活动.通过提供多种用户界面功能, 使应用程序快速和其他的Andorid应用程序一致, 以便被用户熟悉和接受. 主要功能包括: 1. 标识你的应用程序,指示在应用程序的用户的位置. 2. 能很方便的操作重要的功能(像搜索功能) 3. 导航和视图切换功能(使用制表符或下拉列表) 类似的效果如下: 设置操作栏 在基本的使用状况是, 操作栏在左边显示活动的标题和应用的图标. 类似: 设置一个基本的操作栏需要你使用的应用活动主题支持操作栏, 这和

我给女朋友讲编程CSS系列(1) –添加CSS样式的3种方式及样式表的优先权

如果说,原生态就是美,那么,我们就没有必要穿衣打扮. 网页是什么? 说白了,网页就是一堆[html标签]有序的搭配,让[CSS属性值]整整容,请[Javascript语言]处理一下事件. 一个人的整容效果,很大程度上取决于Ta本人,也就是原材料,对网页来说,原材料就是html标签,因此设计优秀的html标签结构十分重要. 整容医生的作用也至关重要,割双眼皮,整容医生的基本功,不同医生割出来的效果不同. 作为一个网页设计师,我们是不是应该追求完美,尽最大努力,让网页漂亮一些. 我知道,我们往往自称

条理清晰的搭建SSH环境之添加所需jar包

一.首先介绍要添加框架环境: JUnit Struts2 Hibernate Spring (1)配置JUnit /**-------------------------添加JUnit-------------------------------*/ 右击Web项目--->Build Path--->Add Libraries--->在"Add Libraries窗口选择Junit"--- --->Next--->选择版本JUnit 4 /**------

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

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

【j2ee spring】11、整合SSH框架之添加一个成员

11.整合SSH框架之添加一个成员 1.我们写一个天机成员的jsp文件 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD H

学习ASP.NET Core Razor 编程系列十——添加新字段

学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面 学习ASP.NET C

验证 SSH Keys 是否添加成功

当ssh秘钥配置完毕后,如何检验ssh keys是否添加成功,输入以下命令: $ ssh -T [email protected] 如图:当看到Hi xxx! You've successfully authenticated, but GitHub does not # provide shell access.就配置后就配置成功了. 原文地址:https://www.cnblogs.com/lisen203/p/9536893.html

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("