重定向
在一般情况下,我们的控制器方法返回字符串类型值,会被封装成一个ModelAndView,然后被当做逻辑视图名称进行处理。但是如果返回的字符串中以“forward:”和“redirect:”开头时,Springmvc将会对他们做特殊处理,将redirect当成重定向操作,将forward当成转发操作。
<b>前台链接</b><br>
<a href="RequestMappingTest/TestRedirect">TestRedirect</a><br>
<!-- 后台处理 -->
@RequestMapping("TestRedirect")
public String testredirect(){
System.out.println("TestRedirect");
//return "redirect:/index.jsp";
//return "redirect:/WEB-INF/view/redirectview.html";
return "redirect:/RequestMappingTest/TestViews";
//return "forward:/index.jsp";
//return "forward:/WEB-INF/view/forwardview.jsp"; //
//return "forward:/RequestMappingTest/TestViews";
}
注意:关于forward与redirect的区别建议去看这两篇帖子
【http://zhulin902.iteye.com/blog/939049】和【http://www.cnblogs.com/selene/p/4518246.html#_label0】
再注意一点:forward 可以直接的访问/WEB-INF里的页面,而redirect就不能了,需要进行映射机制才能进行访问,这也是我们常常犯的错误,直接重定向一个页面。
redirect重定向也被称作间接请求转发,forward 转发也被称为直接请求转发
表单标签
通过我们的Springmvc的表单标签可以实现我们的模型数据和HTML表单元素的绑定,他可以实现表单数据更便捷的编辑,更重要的是 实现了表单值的回显功能。
通过属性modelAttribute属性指定绑定的模型属性,如果没有指定该属性,则默认从Request域对象中读取command的表单属性,如果该属性值也不存在,则会发生错误。
Springmvc提供了多个表单组件标签。
对于表单标签共用的属性【path:表单字段,对应HTML元素的name属性,支持级联属性】
【htmlEscape:是否对表单值的HTML特殊字符进行转化,默认值是true】
【cssClass:表单组件对应的CSS样式类名】
【cssErrorClass:表单组件的数据存在错误时,采取的CSS样式】
表单标签
【form:input】
【form:password】
【form:hidden】
【form:textarea】
【form:radiobutton】单选框组件标签,当表单bean对应的属性值和value值相等时,单选框被选中。
【form:radiobuttons】单选框组件标签,用于构造多个单选框。items:可以是一个List、Map或String数组;itemValue:指定radio的value值,可以是集合中bean的一个属性值;itemLabel:指定radio的label值;delimiter:多个单选框可以通过delimiter指定分隔符。
【form:Checkbox】复选框组件,用于构造单个复选框
【form:Checkboxs】用于构造多个复选框。使用方式同【form:radiobuttons】
【form:select】用于构造下拉框组件。使用方式同【form:radiobuttons】
【form:option】 下拉框选项组件标签。使用方式同【form:radiobuttons】
【form:errors】显示表单组件或数据校验所对应的错误
【form:error path=“※”】显示表单所有错误
【form:error path=“user※”】显示表单所有以user为前缀的属性对应的错误
【form:error path=“username”】显示表单特定对象属性的错误
<!-- 前台表单标签 注意要导入标签库 -->
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form action="${pageContext.request.contextPath }/emp" method="post" modelAttribute="employee" >
<form:hidden path="id" /> <!-- 我们利用隐藏域传递id -->
email:<form:input path="email"/><br/>
<%
Map<String,String> genders = new HashMap<String,String>();
genders.put("1", "Male");
genders.put("0", "FeMale");
request.setAttribute("genders", genders);
%>
gender:<form:radiobuttons path="gender" items="${genders }" /><br/>
<!--支持级联属性 -->
Department:<form:select path="department.id"
items="${departments}" itemLabel="departmentName" itemValue="id"></form:select><br/>
<input type="submit" value="submit"/>
</form:form>
<!--后台数据处理 -->
//新增一个数据,第一步跳转到指定的页面,新增数据进行回显,应为为空,所以new一个新的employee
@RequestMapping(value="/emp",method=RequestMethod.GET)
public String addemp(Map<String,Object> maps){
maps.put("employee", new Employee()); //对应于form表单的modelattribute属性
maps.put("departments",departmentDAO.getDepartments() );
// 对应着前台的select下拉列表的值
return "addemp";
}
//新增一个数据, 第二步 进行提交到后台处理
@RequestMapping(value="/emp",method=RequestMethod.POST)
public String save(Employee employee){
employeeDAO.save(employee);
return "redirect:/list"; // 记得一定是redirect小写的,大写的识别不出来
}
注意:在上面的单选框赋值和复选框赋值时,我们是采用一个在前台,一个在后台。
静态资源文件的处理
问题:我们在使用REST风格的资源URL不希望带.html或者.do等后缀的,而且我们在web.xml配置我们的springDispatcherServlet时利用的拦截WEB容器中的所有请求。所以,对于静态资源例如js等文件的请求也是会进行拦截的。Springmvc会将他们当成一个普通的请求处理,因此会找不到对于的处理器而导致错误。
解决:方法一:我们可以进行拦截器对拦截请求的更改,比如只拦截.do或者.html的请求,但是这样的话又不符合REST风格。
方法二:在Springmvc.xml中配置静态资源的加载【default-servlet-handler】这样的话,我们就可以利用我们的静态资源了。
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
注意:在配置【default-servlet-handler】时,会导致其余的正常连接不好使,所以我们也应该给标配上【mvc:annotation-driven】。
在一般情况下我们的WEB应用服务器默认的Servlet的名称都是default,如果使用的WEB服务器的默认Servlet名称不是default,则需要通过【default-servlet-name】属性进行显示指定。
Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 – “default”
Google App Engine 自带的 默认Servlet的名字 – “_ah_default”
Resin 自带的 默认Servlet的名字 – “resin-file”
WebLogic 自带的 默认Servlet的名字 – “FileServlet”
WebSphere 自带的 默认Servlet的名字 – “SimpleFileServlet”
跳转不经过Controller的实现
在有些时候我们不想让我们的连接经过Controller处理,直接跳转到某一资源。这样的话我们只需要进行一个配置即可。
<b>前台链接</b><br>
<a href="success">Test no controller </a><br>
<!--springmvc.xml配置 可以在处理404等一致资源文件时,可以利用这个进行跳转到同一页面 -->
<!-- 配置mvc:view-controller属性可以直接跳过controller的控制 -->
<mvc:view-controller path="/success" view-name="success"/>
<mvc:annotation-driven></mvc:annotation-driven>
注意:在这里的跳转和上面的会产生同样的问题,造成其他的请求失败,所以我们也需要进行标配【annotation-driven】