【Java EE 学习第70天】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】

一、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                     &nbsp;
 71                     <s:a action="SurveyAction_toEditSurveyPage.action" namespace="/">
 72                         <s:param name="surveyId" value="%{#id}"></s:param>
 73                     编辑调查</s:a>&nbsp;
 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>&nbsp;
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                                                             &nbsp;
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>&nbsp;
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>&nbsp;
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>&nbsp;
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方法,该方法会保存信息到数据库,然后转发到设计调查页面,调查页面会显示出该调查的所有相关信息。

然而这时候诡异的事情发生了,命名修改了调查的名字为居民生活水平调查,但是在设计调查页面显示的还是原来的“未命名调查”,这是为什么呢?

原因分析:

时间: 2024-10-24 15:26:17

【Java EE 学习第70天】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】的相关文章

【Java EE 学习第70天】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算.将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符.最终16Byte就能够转换成为32个字符. 1 package com.kdyzm.utils;

【Java EE 学习第69天】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) 1 public class UserAction implements modelDriven<User>(){ 2 private String name; 3 private User model; 4 public void setName(String name){ 5 this.name=name; 6 } 7 public St

【Java EE 学习第73天】【数据采集系统第五天】【】

一.参与调查的流程 单击导航栏上的“参与调查”按钮->EntrySurveyAction做出相应,找到所有的Survey对象并转发到显示所有survey对象的页面上供用户选择->用户单击其中一个调查进入调查页面->页面提供上一页.下一页.退出.保存等按钮供用户选择->用户单击退出直接返回到显示所有Survey对象的页面上去或者单击提交完成调查返回到参与调查的页面上去. 二.显示所有调查 请求的方法是Action中的toSurveyPage方法 1 public String toS

Java EE学习--Quartz基本用法

新浪博客完全不适合写技术类文章.本来是想找一个技术性的博客发发自己最近学的东西,发现博客园起源于咱江苏,一个非常质朴的网站,行,咱要养成好习惯,以后没事多总结总结经验吧.很多时候都在网上搜索别人的总结,我自己也总结些东西,或许多多少少能帮得上别人. 首先提到的是Quartz,一个开源的定期执行计划任务的框架.其实我内心好奇这个框架很久了,像那些能定时修改数据库数据,定时分配任务的功能一直觉得很神奇.心动不如行动,今天我就小小的学习了一下用法,力求言简意赅,大家都懂的我就不说了. 第一步:下载Qu

Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2) 5 数据库配置 下面,就要通过一个简单的例子,来介绍 SpringMVC 如何集成 Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节

JAVA EE 学习笔记[V1 jsp编程]

在三月初学校开设了javaee的课程,也就此展开了对javaee基础的学习.然后老师也对这次的课程有一定要求.前面的基础就为最终的作业做准备啦~ 在上学期我们学习了java相关知识,也对java se 的安装使用有了一定的认知,而java ee则是构建于java se 平台之上的一套多层的,可扩展的的网络应用. 学习java ee我们首先进行环境的搭建.无非就是使用 tomcat进行服务器的搭建和jdk环境变量配置.而IDE这方面我们选择myeclipse 2016 CI(这个编译器自带tomc

Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 记录: 通过对用户表的管理,更加深入地讲解SpringMVC的操作. 6 用户管理 既然我们

Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 Java EE 学习(8):IDEA + maven + spring 搭建 web(

【Java EE 学习第16天】【dbcp数据库连接池】【c3p0数据库连接池】

零.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: 1 package day16.utils; 2 3 import java.io.IOException; 4 import java.lang.reflect.InvocationHandler; 5 import java.lang.reflect.Method; 6 import java.lang.reflect.Proxy; 7 import java.sql.Connection; 8 import java.sql.D