Springmvc知识三------重定向&表单标签&静态资源的处理

重定向

在一般情况下,我们的控制器方法返回字符串类型值,会被封装成一个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】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值