用户管理模块
---恢复内容开始---
1.总体分析图
1.创建完调查后回到未完成调查页面,利用重定向指向handler,
//创建完调查后回到未完成调查页面,利用重定向指向handler, //为了使查询的结果在第一页显示,查询时按照倒序排列。 order by survey_id desc return "redirect:/guest/survey/myUncompleted/1";
@RequestMapping(value="/guest/survey/myUncompleted/{pageNum}",method=RequestMethod.GET)
2.RESTful风格
<!-- 携带surveyId去后台 -->
<!-- RESTFUL风格:/xxx/23 -->
<!-- 接收方式:@PathVariable注解 -->
<!-- 传统风格:/xxx?surveyId=23 -->
<!-- 接收方式:@RequestParam注解 -->
3.<form:form>标签,通过绑定modelAttribute方便回显
<form:form action="guest/survey/edit" method="PUT" modelAttribute="editSurvey" enctype="multipart/form-data>
<!-- 表单隐藏域 -->
<form:hidden path="surveyId"/>
<form:hidden path="logoPath"/>
</form:form>
4.异常发生时,exception会把modelAttribute填满,用model和map赋值是不行的
if(multipartFile.getSize() > 1024*100){ //异常发生时,exception会把modelAttribute填满,用model和map赋值是不行的 //这里需要我们将模型数据直接存入请求域 request.setAttribute("editSurvey", survey); //为了能够让用户正常提交后还是能够回到之前的分页页面,所以pageNum也必须存入请求域 request.setAttribute("pageNum", pageNum); throw new FileTooLargeForEditException(GlobalMessage.FILE_TOO_LARGE); }
3.set和list
list:有顺序但可以重复
set:没顺序但不可以重复
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
4.获取自增主键值的方式以及相关UPDATE语句(在XML映射文件配置获得)
useGeneratedKeys="true" keyProperty="bagId"
<insert id="insert" parameterType="com.lamsey.survey.entities.guest.Bag" useGeneratedKeys="true" keyProperty="bagId" > insert into guest_bag (bag_id, bag_name, bag_order, survey_id) values (#{bagId,jdbcType=INTEGER}, #{bagName,jdbcType=CHAR}, #{bagOrder,jdbcType=INTEGER}, #{surveyId,jdbcType=INTEGER}) </insert>
5.jquery使用
<!-- 利用js来控制简答题时隐藏提干输入框 --> <script type="text/javascript"> //使用jQuery框架 $(function(){ //1.页面初始化时将#trDiv隐藏 $("#trDiv").hide(); //2.切换题型时切换#trDiv显示隐藏状态 //①获取题型对应的radio元素对象并绑定单击响应函数":radio":匹配所有单选按钮 $(":radio").click(function(){ //②获取当前点击的radio的value值 var type = this.value; //③检查type是否代表选择题 if(type==1|| type==2){ $("#trDiv").show(); } //④检查type是否代表简答题 if(type == 3){ $("#trDiv").hide(); } }); }); </script>
6.模拟浏览器的后退、前进按钮
<script type="text/javascript"> $(function(){ $("button").click(function(){ //模拟浏览器的后退、前进按钮 window.history.back();//forward() }); }); </script>
7.捕捉异常比对
e.getCause()------->获取异常的原因
cause的Exception和捕捉的异常是不一样的、
try{ surveyService.deleteSurvey( surveyId); } catch(Exception e){ if(e!=null){ if(e.getCause() instanceof MySQLIntegrityConstraintViolationException){ throw new RemoveSurveyException(GlobalMessage.REMOVE_SURVEY_FAILED); } } throw e; }
/*[16:25:00][49 ms]*/ ALTER TABLE `survey170228_main`.`guest_question` DROP FOREIGN KEY `guest_question_ibfk_1` ; /*[16:25:02][56 ms]*/ ALTER TABLE `survey170228_main`.`guest_question` ADD CONSTRAINT `guest_question_ibfk_1` FOREIGN KEY (`bag_id`) REFERENCES `survey170228_main`.`guest_bag` (`bag_id`) ON DELETE CASCADE ;
将外键属性设置为CASCADE(级联)即可
方法2:
1)把最底层删除完,一级级往上删除。(推荐)
9.jquery提示删除(经典)
<!-- jQuery --> <script type="text/javascript"> $(function(){ $(".deleteDeeply").click(function(){ var SurveyName = $(this).parents("tr").children("td:eq(2)").text(); var flagFirst = confirm("你真的要删除"+SurveyName+"这个调查吗?"); if(flagFirst) { var flagSecond = confirm("你确定真的要这么做吗?这个操作很危险,调查中的包裹和问题也会被删除!请一定要确认!"); if(flagSecond) { //两次confirm都点确定才会执行超链接 return true; } } //两次confirm中有任何一次点取消都不执行超链接 return false; }); }); </script>
10.集合类判断是否为空采用isEmpty()
if(survey.getBagSet().isEmpty()){ throw new SurveyWithoutAnyBagException(GlobalMessage.SURVEY_WITHOUT_ANY_BAG); }
11.mybatis ----foreach
foreach
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
open:以什么符号开头
close:以什么符号结尾
item:遍历时的变量
separator:分割的符号
collection:遍历的数组list集合,如果想使用数组名,需要预先用@Param定义,否则默认用list
void updateBagOrderBatch(@Param("bagList")List<Bag> bagList);
用在批量操作,一次执行多条SQL语句。
<update id="updateBagOrderBatch"> <foreach collection="bagList" item="bag" separator=";"> update guest_bag set bag_order = #{bag.bagOrder,jdbcType=INTEGER} where bag_id = #{bag.bagId,jdbcType=INTEGER} </foreach> </update>
注意:开启批量处理,需要在mysql中设置
allowMultiQueries属性为true
jdbc:mysql://localhost:3306/survey170228_main?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8
12.对文本框内的内容是否为数字进行验证
<script type="text/javascript"> $(function(){ //采用属性过滤器筛选 $("[name=bagOrderList]").change(function(){ //1.获取当前文本输入框的内容 //$(this).val(); var bagOrder = this.value; //2.去除前后空格 bagOrder=$.trim(bagOrder); //3.对bagOrder进行验证 if(bagOrder==""||isNaN(bagOrder)){ //4.如果验证失败则恢复默认值 this.value=this.defaultValue; return; } //4.验证成功后应该将去除了前后空格的bagOrder写回到文本框 this.value = bagOrder; //5.更新文本框的默认值,这样更新后下次再验证失败恢复的就是这个新值而不是浏览器刚打开这个页面时的初始值 this.defaultValue=bagOrder; }); }); </script>
13.对map进行遍历和对数组进行遍历
/** * 写一个遍历Map<String,Map<String,String[]>> * 的工具方法 */ public static void showAllMapValue(Map<String,Map<String,String[]>> param){ Set<Entry<String,Map<String,String[]>>> entrySet = param.entrySet(); for(Entry<String, Map<String, String[]>> entry:entrySet){ System.out.println("bagId:"+entry.getKey()); Map<String, String[]> map = entry.getValue(); Set<Entry<String, String[]>> entrySet2 = map.entrySet(); for(Entry<String, String[]> entry1:entrySet2){ System.out.println("name:"+entry1.getKey()); //value值是一个字符串数组,数组名仅仅作为一个对象(指针) String[] value = entry1.getValue(); //采用数组类将其转化为List集合进行打印 List<String> asList = Arrays.asList(value); System.out.println("value:"+asList); } System.out.println(); } }
14.maven添加相同的组件,复制,不要引用后随意移动
15.在jsp中输出java表达式打印字符串。
<c:if test="${question.questionType==3 }"> <input type="text" name="q${question.questionId }" class="form-control" <%=DataprocessUtils.checkRedisplay(pageContext) %> /> </c:if>
pageContext 属于jsp的9大内置对象之一
Question question = (Question)pageContext.findAttribute("question");
findAttribute:寻找属性的值
Jsp9大内置对象总结
request 对象 请求对象,可以获取请求信息
response 对象 响应对象。可以设置响应信息
pageContext 对象 当前页面上下文对象。可以在当前上下文保存属性信息
session 对象 会话对象。可以获取会话信息。
exception 对象 异常对象只有在jsp页面的page 指令中设置 isErrorPage="true" 的时候才会存在
application 对象 ServletContext对象实例,可以获取整个工程的一些信息。
config 对象 ServletConfig对象实例,可以获取Servlet的配置信息
out 对象 输出流。
page 对象 表示当前Servlet对象实例(无用,用它不如使用this对象)。
<c:if test="${not empty requestScope.exception}"> ${requestScope.exception.message} </c:if>
九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象。
16.java生成UUID通用唯一识别码 (Universally Unique Identifier)
//获取uuid,随机产生一个通用识别码 String uuid = UUID.randomUUID().toString();
17.Stiring
paramStr.substring(1);
从索引1开始截取子字符串
18
SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称