标签:
一、Action中User注入问题
Action中可能会经常用到已经登陆的User对象,如果每次都从Session中拿会显得非常繁琐。可以想一种方法,当Action想要获取User对象的时候直接使用,这种方法还是得需要借助拦截器的力量,直接在登录拦截器中实现即可,但是登陆拦截器怎么知道该Action想要获取User对象呢?这就需要给Action加上一个接口,如果该Action是该接口的实现类,则表示该Action想要获取User对象。接口仿照HttpRequestAware接口的形式,名字为用户关注接口:
1 package com.kdyzm.struts.action.aware; 2 3 import com.kdyzm.domain.User; 4 /** 5 * 用户关注接口,用于Action获取Session中的User对象 6 * @author kdyzm 7 * 8 */ 9 public interface UserAware { 10 public void setUser(User user); 11 }
这样在登陆拦截器中直接进行判断即可,如果用户已经登陆了,而且请求的Action是UserAware的实现类,那么就通过setUser方法将User注入到Action中。这样登录拦截器中的intercept方法就变成了如下的形式:
1 public String intercept(ActionInvocation invocation) throws Exception { 2 System.out.println("被登录拦截器拦截!"); 3 Action action=(Action) invocation.getAction(); 4 if(action instanceof LoginAction ||action instanceof RegisterAction){ 5 System.out.println("即将进行登录或者注册,直接放行!"); 6 return invocation.invoke(); 7 } 8 HttpServletRequest request=ServletActionContext.getRequest(); 9 HttpSession session=request.getSession(); 10 User user=(User) session.getAttribute("user"); 11 if(user==null){ 12 System.out.println("用户未登录,必须先登录再访问其他资源!即将跳转到登陆界面!"); 13 return "toLoginPage"; 14 }else{ 15 System.out.println("用户已经登陆,登录拦截器已经放行!"); 16 //如果用户名不为空,而且实现了UserAware接口,就需要调用该接口中的相应方法给类中的成员变量赋值 17 //TODO 给Action中User动态赋值的方法 18 if(action instanceof UserAware){ 19 ((UserAware)action).setUser(user); 20 } 21 return invocation.invoke(); 22 } 23 }
二、设计调查页面,设计调查页面几乎是该项目中最复杂的一个页面了在“我的调查”中的其中一个调查栏目中直接单击“设计调查”超链接,就直接跳转到设计调查页面,当然需要在Action将调查对象(Survey对象)先查询出来。完整的页面设计代码如下这个页面设计起来非常困难,我也是写了好几个小时才完成的,因为需要考虑到很多因素,需要一步一步的进行调试才行。
完整代码是:
1 <%@ page language="java" pageEncoding="utf-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6 <link rel="stylesheet" href="${pageContext.servletContext.contextPath}/css/header.css" type="text/css"> 7 <style type="text/css"> 8 table{ 9 border: 1px solid black; 10 border-collapse: collapse; 11 width: 100%; 12 } 13 table tr{ 14 border-collapse: collapse; 15 } 16 tr td{ 17 border:1px solid black; 18 border-collapse: collapse; 19 } 20 a{ 21 color: gray; 22 text-decoration: none; 23 } 24 a:HOVER { 25 color: red; 26 } 27 .tdHL{ 28 text-align: left; 29 border-width: 0px; 30 } 31 .tdHR{ 32 text-align: right; 33 border-width: 0px; 34 } 35 .pageTitle{ 36 background-color: #CCF; 37 } 38 .questionTitle{ 39 background-color: #CCC; 40 } 41 </style> 42 <title>Insert title here</title> 43 </head> 44 <body> 45 <%@ include file="/header.jsp" %> 46 <div> 47 <!-- 先设计一个变量保存住surveyid --> 48 <s:set value="%{surveyId}" name="id"/> 49 <table> 50 <tr> 51 <td colspan="2">设计调查</td> 52 </tr> 53 <tr> 54 <td class="tdHL"> 55 <!-- 这里使用sturs2标签直接判断图片是否存在! --> 56 <!-- 在这里加上一个logo标识 --> 57 <s:if test="isLogoImageExists()"> 58 <img width="40px" alt="这是logo标识" src="<s:url value=‘%{logoPath}‘/>"/> 59 </s:if> 60 <s:else> 61 <!-- 如果图片不存在,则什么都不显示 --> 62 </s:else> 63 <s:property value="title"/> 64 </td> 65 <td class="tdHR"> 66 <s:a action="SurveyAction_toUploadLogoPage.action" namespace="/"> 67 <s:param name="surveyId" value="%{#id}"></s:param> 68 增加Logo 69 </s:a> 70 71 <s:a action="SurveyAction_toEditSurveyPage.action" namespace="/"> 72 <s:param name="surveyId" value="%{#id}"></s:param> 73 编辑调查</s:a> 74 <s:a action="PageAction_toAddPagePage.action" namespace="/"> 75 <s:param value="%{#id}" name="surveyId"></s:param> 76 增加页</s:a> 77 </td> 78 </tr> 79 <tr> 80 <td colspan="2"> 81 <!-- 主干内容开始 --> 82 <table> 83 <tr> 84 <td width="20px"></td> 85 <td width="*"> 86 <!-- 迭代页面集合 --> 87 <table> 88 <s:iterator value="%{pages}" var="page"> 89 <s:set var="pId" value="%{#page.pageId}"></s:set> 90 <tr> 91 <td> 92 <table> 93 <tr class="pageTitle"> 94 <!-- 页面标题 --> 95 <td width="40%" class="tdHL"> 96 <s:property value="%{#page.title}"/> 97 </td> 98 <td width="60%" class="tdHR"> 99 <s:a action="PageAction_toEditPageTitlePage.action" namespace="/"> 100 <s:param name="pageId" value="%{#pId}"></s:param> 101 <s:param name="surveyId" value="%{#id}"></s:param> 102 编辑页面标题</s:a> 103 <s:a action="PageAction_toSelectTargetPage.action" namespace="/"> 104 <s:param name="pageId" value="%{#pId}"></s:param> 105 <s:param name="surveyId" value="%{#id}"></s:param> 106 移动/复制页 107 </s:a> 108 109 <s:a action="QuestionAction_toSelectQuestionTypePage.action" namespace="/"> 110 <s:param name="pageId" value="%{#pId}"></s:param> 111 <s:param name="surveyId" value="%{#id}"></s:param> 112 增加问题</s:a> 113 <s:a action="PageAction_deletePage.action" namespace="/"> 114 <s:param name="pageId" value="%{#pId}"></s:param> 115 <s:param name="surveyId" value="%{#id}"></s:param> 116 删除页</s:a> 117 </td> 118 </tr> 119 <tr> 120 <td colspan="2"> 121 <table> 122 <tr> 123 <td width="20px"></td> 124 <td> 125 <!-- 迭代问题的集合 --> 126 <table> 127 <s:iterator value="%{#page.questions}" var="question"> 128 <s:set var="qid" value="%{#question.questionId}"></s:set> 129 <!-- 问题题干 --> 130 <tr class="questionTitle"> 131 <td class="tdHL"><s:property value="%{#question.title}"/></td> 132 <td class="tdHR"> 133 <s:a action="QuestionAction_editQuestion.action" namespace="/"> 134 <s:param name="pageId" value="%{#pId}"></s:param> 135 <s:param name="surveyId" value="%{#id}"></s:param> 136 <s:param name="questionId" value="%{#qid}"></s:param> 137 编辑问题</s:a> 138 <s:a action="QuestionAction_deleteQuestion.action" namespace="/"> 139 <s:param name="pageId" value="%{#pId}"></s:param> 140 <s:param name="surveyId" value="%{#id}"></s:param> 141 <s:param name="questionId" value="%{#qid}"></s:param> 142 删除问题</s:a> 143 </td> 144 </tr> 145 <!-- 问题主体,主要涉及的问题就是问题的分类 --> 146 <tr> 147 <td colspan="2"> 148 <!-- 定义变量,为当前类型的题型 --> 149 <s:set value="%{#question.questionType}" var="qt"></s:set> 150 <!-- 第一种题型:带有单选框或者复选框的 151 题目标识就是题号小于4,0-3 152 --> 153 <s:if test="#qt lt 4"> 154 <s:iterator value="#question.optionTextArr"> 155 <input type=‘<s:property value="#qt<2?‘radio‘:‘checkbox‘"/>‘> 156 <s:property/> 157 <s:if test="#qt==1 || #qt==3"> 158 <br/> 159 </s:if> 160 </s:iterator> 161 <!-- 处理other的情况 --> 162 <s:if test="#question.other"> 163 <input type=‘<s:property value="#qt<2?‘radio‘:‘checkbox‘"/>‘>其它 164 <s:if test="#question.otherType==1"> 165 <input type="text"> 166 </s:if> 167 <s:elseif test="#question.otherType==2"> 168 <s:select list="#question.otherSelectOptionArr"> 169 </s:select> 170 </s:elseif> 171 </s:if> 172 </s:if> 173 <!-- 第二种题型,是下拉列表类型的题型 --> 174 <s:elseif test="#qt==4"> 175 <s:select list="#question.optionTextArr"></s:select> 176 </s:elseif> 177 <s:elseif test="#qt==5"> 178 <s:textfield></s:textfield> 179 </s:elseif> 180 <!-- 第三种题型,矩阵问题,6,7,8 --> 181 <s:else> 182 <table> 183 <!-- 列头 --> 184 <tr> 185 <td></td> 186 <s:iterator value="#question.matrixColTitleArr"> 187 <td><s:property/></td> 188 </s:iterator> 189 </tr> 190 <!-- 输出N多行 --> 191 <s:iterator value="#question.matrixRowTitleArr"> 192 <tr> 193 <td><s:property/></td> 194 <s:iterator value="#question.matrixColTitleArr"> 195 <td> 196 <s:if test="#qt==6"> 197 <input type="radio"> 198 </s:if> 199 <s:elseif test="#qt==7"> 200 <input type="checkbox"> 201 </s:elseif> 202 <s:elseif test="#qt==8"> 203 <select> 204 <s:iterator value="#question.matrixSelectOptionArr"> 205 <option> 206 <s:property/> 207 </option> 208 </s:iterator> 209 </select> 210 </s:elseif> 211 </td> 212 </s:iterator> 213 </tr> 214 </s:iterator> 215 </table> 216 </s:else> 217 </td> 218 </tr> 219 </s:iterator> 220 </table> 221 </td> 222 </tr> 223 </table> 224 </td> 225 </tr> 226 </table> 227 </td> 228 </tr> 229 </s:iterator> 230 </table> 231 </td> 232 </tr> 233 </table> 234 </td> 235 </tr> 236 </table> 237 </div> 238 </body> 239 </html>
最核心的代码是对问题种类的判断:
1 <s:set value="%{#question.questionType}" var="qt"></s:set> 2 <!-- 第一种题型:带有单选框或者复选框的 3 题目标识就是题号小于4,0-3 4 --> 5 <s:if test="#qt lt 4"> 6 <s:iterator value="#question.optionTextArr"> 7 <input type=‘<s:property value="#qt<2?‘radio‘:‘checkbox‘"/>‘> 8 <s:property/> 9 <s:if test="#qt==1 || #qt==3"> 10 <br/> 11 </s:if> 12 </s:iterator> 13 <!-- 处理other的情况 --> 14 <s:if test="#question.other"> 15 <input type=‘<s:property value="#qt<2?‘radio‘:‘checkbox‘"/>‘>其它 16 <s:if test="#question.otherType==1"> 17 <input type="text"> 18 </s:if> 19 <s:elseif test="#question.otherType==2"> 20 <s:select list="#question.otherSelectOptionArr"> 21 </s:select> 22 </s:elseif> 23 </s:if> 24 </s:if> 25 <!-- 第二种题型,是下拉列表类型的题型 --> 26 <s:elseif test="#qt==4"> 27 <s:select list="#question.optionTextArr"></s:select> 28 </s:elseif> 29 <s:elseif test="#qt==5"> 30 <s:textfield></s:textfield> 31 </s:elseif> 32 <!-- 第三种题型,矩阵问题,6,7,8 --> 33 <s:else> 34 <table> 35 <!-- 列头 --> 36 <tr> 37 <td></td> 38 <s:iterator value="#question.matrixColTitleArr"> 39 <td><s:property/></td> 40 </s:iterator> 41 </tr> 42 <!-- 输出N多行 --> 43 <s:iterator value="#question.matrixRowTitleArr"> 44 <tr> 45 <td><s:property/></td> 46 <s:iterator value="#question.matrixColTitleArr"> 47 <td> 48 <s:if test="#qt==6"> 49 <input type="radio"> 50 </s:if> 51 <s:elseif test="#qt==7"> 52 <input type="checkbox"> 53 </s:elseif> 54 <s:elseif test="#qt==8"> 55 <select> 56 <s:iterator value="#question.matrixSelectOptionArr"> 57 <option> 58 <s:property/> 59 </option> 60 </s:iterator> 61 </select> 62 </s:elseif> 63 </td> 64 </s:iterator> 65 </tr> 66 </s:iterator> 67 </table> 68 </s:else>
之前就说过,每个问题的位置不能改变,这是因为将会使用该问题的下标得到该问题是什么种类的问题,一种有九种类型的问题,每一种问题都对应一种独一无二的问题类型。
最终设计效果如下图所示:当然如果只是当前阶段的话是没有这种效果的,必须结合之后的添加问题的功能才行。整个页面都是用表格标签进行了嵌套,所以显得比较难看,但是也没有好的方法,如果有时间的话就会对其进行优化。
三、Action中模型赋值问题。
每一个Action基本上都是BaseAction的子类,继承BaseAction的优点就是不需要每次都实现模型驱动接口并且重写getModel方法了,模型的赋值过程将会在父类中实现,这里当然也会用到泛型。
但是实现了模型驱动接口需要注意一点事项:可能会有数据库中的信息和前端页面显示的信息不一致的情况发生。
首先实现编辑调查功能,小功能非常小,所以略过不提。但是有必要说一下这个过程,因为这是引发该问题的关键
在设计调查页面单击“编辑调查”->请求SurveyAction.toEditSurveyPage()方法,该方法查询数据库,赋值到model->跳转到editSurveyPage.jsp页面回显->单击保存按钮->请求SurveyAction.editSurveyPage方法,该方法会保存信息到数据库,然后转发到设计调查页面,调查页面会显示出该调查的所有相关信息。
然而这时候诡异的事情发生了,命名修改了调查的名字为居民生活水平调查,但是在设计调查页面显示的还是原来的“未命名调查”,这是为什么呢?
原因分析:
【Java EE 学习第70天】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】
标签:
原文地址:http://www.cnblogs.com/kuangdaoyizhimei/p/5052234.html