Outline:
1) Annotation Based Url Mapping Config
2) Pass Value from View to Controller
3) Pass Value from Controller to View
HandlerMapping
1) SimpleUrlHandlerMapping (Not often used)
<beans ...> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /index.htm=welcomeController /welcome.htm=welcomeController /main.htm=welcomeController /home.htm=welcomeController </value> </property> </bean> <bean id="welcomeController" class="com.mkyong.common.controller.WelcomeController" /> </beans>
2) ControllerBeanNameHandlerMapping (Not often userd)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/context/spring-mvc.xsd"> <!-- Handler Mapping --> <bean class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping" /> <bean name="/welcome.html" class="edu.xmu.webproject.controller.WelcomeController"></bean> </beans>
3) DefaultAnnotationHandlerMapping (Often used)
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="edu.xmu.webproject.controller" /> <mvc:annotation-driven /> <!-- View Resolver for JSPs --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
HelloController.java
package edu.xmu.webproject.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { // RequestMapping represents which url mapped to this method @RequestMapping({ "/hello", "/" }) public String hello() { return "hello"; } }
hello.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>Hello</h1> </body> </html>
Final Test
2. Value Transportation
1) Pass Value from View to Controller
HelloController.java
package edu.xmu.webproject.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class HelloController { // RequestMapping represents which url mapped to this method @RequestMapping({ "/hello", "/" }) public String hello(@RequestParam("username") String userName) { System.out.println("username=" + userName); return "hello"; } }
Request Url
http://localhost:8080/WebProject/hello?username=davy
Console Output
username=davy
Request Url
http://localhost:8080/WebProject/hello
Got HTTP Stauts 400 Error. Bad request.
Why? Cause spring-mvc supports RESTFUL style, as long as we pass the params, RESTFUL style regards that as a part of URL.
2) A more simple way to pass value from View to Controller
HelloController.java
package edu.xmu.webproject.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { // RequestMapping represents which url mapped to this method @RequestMapping({ "/hello", "/" }) public String hello(String username) { System.out.println("username=" + username); return "hello"; } }
We removed the annotation "@RequestParam". That requires "username" be exactly the same with the request url's param key.
http://localhost:8080/WebProject/hello?username=davy # username=davy http://localhost:8080/WebProject/hello # username=null http://localhost:8080/WebProject/hello?userName=davy # username=null
3) Pass value from Controller to View
HelloController.java
package edu.xmu.webproject.controller; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { // RequestMapping represents which url mapped to this method @RequestMapping({ "/hello", "/" }) public String hello(String username, Map<String, Object> context) { System.out.println("username=" + username); context.put("username", username); return "hello"; } }
hello.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>Hello ${username}</h1> </body> </html>
Request Url
http://localhost:8080/WebProject/hello?username=davy
Output
Hello davy
4) A recommanded way to pass value from Controller to View
HelloController.java
package edu.xmu.webproject.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { // RequestMapping represents which url mapped to this method @RequestMapping({ "/hello", "/" }) public String hello(String username, Model model) { System.out.println("username=" + username); model.addAttribute("username", username); // The key is the type of the value, first letter lowercase model.addAttribute(username); return "hello"; } }
hello.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>Hello ${username} & ${string}</h1> </body> </html>
3. Model Driven Value Transportation
What if we need to pass 20 params to the controller?
How should we encapsulate these params into Object/Model?
Example below shows how to use model driven to pass model between view and controller.
1) User.java
package edu.xmu.webproject.bean; public class User { private String username; private String password; private String nickname; private String email; public User(String username, String password, String nickname, String email) { super(); this.username = username; this.password = password; this.nickname = nickname; this.email = email; } public User() { super(); } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2) UserController.java
package edu.xmu.webproject.controller; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import edu.xmu.webproject.bean.User; @Controller @RequestMapping("/user") public class UserController { private Map<String, User> userMap = new HashMap<String, User>(); public UserController() { userMap.put("davy", new User("Davy", "Jones", "davy", "davy@gmail.com")); userMap.put("calypso", new User("Calypso", "Jones", "carl", "carl@gmail.com")); userMap.put("obama", new User("Obama", "Barack", "obama", "obama@gmail.com")); userMap.put("tom", new User("Tom", "Cruize", "tom", "tom@gmail.com")); } @RequestMapping(value = "/users", method = RequestMethod.GET) public String listAllUsers(Model model) { System.out.println("List all users"); model.addAttribute("userMap", userMap); return "/user/list"; } // This method nevigate us to the page for add user @RequestMapping(value = "/add", method = RequestMethod.GET) public String addUser(Model model) { System.out.println("Nevigate to add user page"); // For the benefit of open model driven model.addAttribute("user", new User()); return "/user/add"; } // This method handle the request for add user @RequestMapping(value = "/add", method = RequestMethod.POST) public String addUser(User user) { System.out.println("Add user"); String username = user.getUsername(); userMap.put(username, user); return "redirect:/user/users"; } }
3) list.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a href="add">Add User</a> <br /> <c:forEach items="${userMap}" var="user"> ---------${user.value.username} ---------${user.value.password} ---------${user.value.nickname} ---------${user.value.email} <br /> </c:forEach> </body> </html>
4) add.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <!-- Here we didn't assign an action for this form. --> <!-- By default, the form will be submitted to current path '/user/add' --> <!-- With the method POST --> <sf:form method="post" modelAttribute="user"> username: <sf:input path="username" /> <sf:errors path="username"/> <br /> password: <sf:input path="password" /><sf:errors path="password"/> <br /> nickname: <sf:input path="nickname" /> <br /> email: <sf:input path="email" /><sf:errors path="email"/> <br /> <input type="submit" value="Submit" /> </sf:form> </body> </html>
5) springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="edu.xmu.webproject.controller" /> <mvc:annotation-driven /> <!-- View Resolver for JSPs --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
6) web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>WebProject</display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
7) pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>edu.xmu.web.WebProject</groupId> <artifactId>WebProject-Core</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <spring.version>3.0.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!-- Spring 3 dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- JSTL --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <webXml>WebContent\WEB-INF\web.xml</webXml> </configuration> </plugin> </plugins> </build> </project>
8) Final Test
Model Driven Summary:
1) Model from Controller to View to display user info:
1> Store beans to model
@RequestMapping(value = "/users", method = RequestMethod.GET) public String listAllUsers(Model model) { System.out.println("List all users"); model.addAttribute("userMap", userMap); return "/user/list"; }
2> Use JSTL in JSP page in order to display model content
<!-- JSTL --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> ... <c:forEach items="${userMap}" var="user"> ---------${user.value.username} ---------${user.value.password} ---------${user.value.nickname} ---------${user.value.email} <br /> </c:forEach>
2) Model from View to Controller to add user info:
1> Open model driven in controller, if we don't add User to model, then the view will not know the type of Model.
Exceptions below will occur:
十一月 09, 2013 8:29:48 下午 org.springframework.web.servlet.tags.RequestContextAwareTag doStartTag 严重: Neither BindingResult nor plain target object for bean name 'user' available as request attribute java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
// First way to open model driven // This method nevigate us to the page for add user @RequestMapping(value = "/add", method = RequestMethod.GET) public String addUser(Model model) { System.out.println("Nevigate to add user page"); // For the benefit of open model driven model.addAttribute("user", new User()); return "/user/add"; } // Second way to open model driven // This method nevigate us to the page for add user @RequestMapping(value = "/add", method = RequestMethod.GET) public String addUser(@ModelAttribute("user") User user) { System.out.println("Nevigate to add user page"); return "/user/add"; }
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%> ... <sf:form method="post" modelAttribute="user"> username: <sf:input path="username" /> <sf:errors path="username"/> <br /> password: <sf:input path="password" /><sf:errors path="password"/> <br /> nickname: <sf:input path="nickname" /> <br /> email: <sf:input path="email" /><sf:errors path="email"/> <br /> <input type="submit" value="Submit" /> </sf:form>
// This method handle the request for add user @RequestMapping(value = "/add", method = RequestMethod.POST) public String addUser(User user) { System.out.println("Add user"); String username = user.getUsername(); userMap.put(username, user); return "redirect:/user/users"; }
Reference Links:
1) http://www.mkyong.com/spring-mvc/configure-the-handler-mapping-priority-in-spring-mvc/
2) http://docs.spring.io/spring/docs/3.0.x/reference/mvc.html
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip