安裝環境

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>