安裝環境
O.S.:Win7
JDK:1.8.0
Eclipse:Luna 4.4.1
Server:Tomcat 1.8
寫第一支Spring mvc程式,先將common-logging.jar和spring.jar放置在WEB/INF/lib下。
Spring mvc的架構controller的部分是透過DispatcherServlet去處理(針對結尾為.do)request,若是沒針對contextConfigLocation去做設定(spring-config,xml),預設會是[servlet-name]-servlet.xml(此例則是HelloWeb-servlet.xml)。
web.xml
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
spring-config.xml畫面(view)的處理是由InternalResourceViewResolver去處理,他可以針對/WEB-INF/jsp/資料匣下的副檔名為jsp去處理。當url結尾為hello.do時,DispatcherServlet會派HelloControler去處理,另外JAVA POJO型式可透過spring DI注入的方式進行設定。
spring-config.xml
<context:component-scan base-package="com.example" />
bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean name="/hello.do" class="com.example.HelloControler">
<property name="user">
<value>Paul</value>
</property>
</bean>
HelloControler透過實作Controller中的handleRequest方法去完成request請求,並透過Model(ModelAndView)將其導至相關畫面(HelloWorld),第二個參數為key值,第三個參數可放要呈現畫面資料的物件,類似request.setAttribute("key",value) ;
HelloController.java
package com.example; import java.lang.annotation.Annotation; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView; public class HelloControler implements Controller { private String user ; public String getUser() { return user; } public void setUser(String user) { this.user = user; } @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { return new ModelAndView("HelloWorld","user",user); } }
HelloWorld.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
<h2>hello,${user}</h2>
</body>
</html>
利用servlet去使用Spring的容器功能,需在web.xml去定義listener。ContextLoaderListener預設是抓applicationContext.xml設定,若不想預設可透過 <context-param>去定義自訂的XML。
web.xml
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/timeservlet.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>time</servlet-name>
<servlet-class>
com.example.TimeServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>time</servlet-name>
<url-pattern>/time.do</url-pattern>
</servlet-mapping>
timeservlet.xml
<context:component-scan base-package="com.example" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="datebean" class="java.util.Date" />
Spring提供了WebApplicationContext物件實例,使得在servlet上可以利用此物件實例取得bean的物件實例。
TimeServlet.java
package com.example; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; public class TimeServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext()); PrintWriter out = res.getWriter(); out.println(ctx.getBean("datebean")); } }
利用Anotation可以簡化xml相關設定。
web.xml
<display-name>Spring MVC Application</display-name>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
spring-config.xml
<context:component-scan base-package="com.example" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
HelloController.java
package com.example; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("/hello") public class HelloControler { @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("user", "Paul"); return "HelloWorld"; } }
HelloWorld.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
<h2>hello,${user}</h2>
</body>
</html>
Spring RESTful
you need PathVariable, RequestMapping and RequestMethod.
web.xml
<display-name>Spring MVC Application</display-name>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
spring-config.xml
<context:component-scan base-package="com.example" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
HelloControler.java
package com.example; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("/hello") public class HelloControler { @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("user", "Paul"); return "HelloWorld"; } @RequestMapping(value="/{name}", method = RequestMethod.GET) public String printHello(@PathVariable String name,ModelMap model) { model.addAttribute("user", name); return "HelloWorld"; } }
HelloWorld.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
<h2>hello,${user}</h2>
</body>
</html>