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

    xiaoxiao2021-03-25  57

    重定向

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

    转载请注明原文地址: https://ju.6miu.com/read-150371.html

    最新回复(0)