CRUD之增加
这一篇笔记是CRUD的第二篇,以下的内容都在第一篇的基础之上,查看第一篇请点击springmvc学习笔记(18)——CRUD之查询
DAO中补充增加方法
/**
* 增加一个学生
* @param student
*/
public void add(Student student){
//这里应该做一个验证,如验证学生ID是否已经存在等,为了方便,此次暂时不做处理
//在实际情况中,在数据库中可以让ID自增长
students.put(student.getStudentId(), student);
}
增加学生(界面)
在jsp中,我们使用了form标签,和struts2所用的标签有些类似
前端
引入标签
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
表单
<form:form action="student" method="POST" modelAttribute="student">
ID:<form:input path="studentId" /><br>
姓名:<form:input path="name" /><br>
性别:<form:radiobuttons path="sex" items="${sex }" /><br>
省份:<form:input path="address.province" /><br>
城市:<form:input path="address.city" /><br>
<input type="submit" value="add" />
</form:form>
解析
1.path
相当于html标签中的name
2.form:radiobuttons
后的items
从请求域中获取选项值,就这点而言,springmvc不如strust2方 便,具体怎么将选项放入请求域,请看下面一段控制层的代码
3. 这里有一个属性modelAttribute,必写。因为springmvc默认 表单是要回显的,因此springmvc在你访问该页面的时候,会去modelAttribute中找表单中属性的值,而modelAttribute的默认值为command。如果你不写modelAttribute,会报错,你能从错误信息中找到command
这样的关键字。
4. 如果你实在不想写modelAttribute,那么可以在控制层中使用map.put("command", new Student());
,详见下方控制层代码
5. 其他关于modelAttribute的用法,请查看springmvc学习笔记(12)——ModelAttribute
控制层
/**
* 增加学生 页面
* @param map
* @return
*/
@RequestMapping("/input")
public String input(Map<String, Object> map){
//将性别的选项放入map中,springmvc的form:radiobuttons标签将自行解析
Map<String, String> sexMap = new HashMap<String, String>();
sexMap.put("男", "男");
sexMap.put("女", "女");
map.put("sex", sexMap);
//放入一个默认的空的信息
map.put("student", new Student());
//如果前端form中没有写modelAttribute,请用以下这句代码
//map.put("command", new Student());
return "input";
}
以上代码是 增加学生页面 的初始化,个人感觉是有一些些麻烦,不过它能实现表单的回显,相比于原始的jsp-servlet来说,还是方便了很多。
在后面CRUD之修改中,将会使用到表单的回显
增加学生(POST提交)
将表单提交到后台,交由以下目标方法处理
/**
* 增加学生
* @param student
* @return
* @throws UnsupportedEncodingException
*/
@RequestMapping(value="student",method=RequestMethod.POST)
public String add(Student student){
studentDao.add(student);
return "redirect:/student";//重定向到 显示学生列表界面
}
增加的操作基本都交由DAO来做
这里值得注意的就是return "redirect:/student";
重定向的路径是显示学生列表的路径,而增加学生的路径也是/student
,那么springmvc怎么知道我们到底要访问哪个目标方法,这就是REST风格,有关rest的使用,请查看springmvc学习笔记(4)——REST
注意
- 提交数据之后,也许你会发现中文乱码的问题,最优解决方案如下:
在web.xml中添加spring自带的过滤器。
该过滤器一定要加载 dispatcherServlet前面,否则无效。
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>