close

安裝環境

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>
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Codeless 的頭像
    Codeless

    Codeless的部落格

    Codeless 發表在 痞客邦 留言(0) 人氣()