- 建立Spring MVC
- 含有2種做法(1.一般 2. RequestMapping)
範例環境
- Intellj 13
- Spring 3.2.0
- Tomcat 7.0
前置作業
- 參考下列網址提供之 jar 檔下載
- 參考網址:
http://openhome.cc/Gossip/SpringGossip/FirstSpringMVC.html
http://blog.kenyang.net/2010/10/14/spring-mvcspringjar-spring-webmvc
範例實作
目標:
在index.jsp頁面輸入"字串",透過Spring MVC 將"字串"導到hello.jsp
0.檔案目錄結構
1.Tomcat 運行
2.Spring jar 檔匯入
3.web.xml設定
- 注意事項
a.設定『Tomcat』一啟動要進入的url(可自行決定是否加入)
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
b.只要任何url後面為.do(例如:http://localhost:8080/hello.do),就會被『導入』到名稱為mvc-dispatcher的servletc.該servlet會在進入/WEB-INF/mvc-config.xml 該設定檔讀取設定(servlet-mapping會去找相同名稱的servlet此範例為name=mvc-dispatcher)
d.
如果今天想要強迫Web Container啟動時
1.就要載入特定的Servlet
2.並且指定載入的順序
那麼就需要<load-on-startup>標籤了
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
4.mvc-config.xml 設定注意:請直接參考code的內容註釋
<?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" 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"> <!--要使用RequestMapping要有下面這句,url進來,到指定的資料夾中找,有設定RequestMapping的Controller--> <context:component-scan base-package="main"/> <!--RequestMapping結束--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--InternalResourceViewResolver的"prefix"、"suffix"屬性會與ModelAndView返回的路徑資訊結合--> <!--在servlet requestMapping都會把路徑寫好,所以 打 / 就好)--> <property name="prefix"> <value>/</value> </property> <!--讀取"副檔名".jsp開頭的檔案--> <property name="suffix"> <value>.jsp</value> </property> </bean> <!--第一種MyController沒有用RequestMapping,要特別指定,哪個url進來,要進到哪個controller--> <!--若有使用RequestMapping,則不需下面這段--> <!--網址為/hello.do進來的request,要進到哪一個controller--> <bean name="/hello.do" class="main.MyController"> </bean> </beans>InternalResourceViewResolver 的設定不是必要的,如果沒設,處理請求的元件就必須以字串告知 spring-webmvc,接下來由哪個 URL 組織畫面進行回應,也就是你必須傳回如 "hello.jsp" 這樣的字串,這樣會比較沒有彈性,如上設定 InternalResourceViewResolver 的話,你只要傳回 "hello" 字串,InternalResourceViewResolver 會自動根據 prefix 與 suffix 設定,得知目前實際上要以 "/hello.jsp" 來進行『畫面回應』,將來若想要改為其他回應技術,就只需要修改 XML 檔案。
重點:
所以最後是return『response』回應給傳進來的request
而這個『response』是透過ModeAndView進行組織的,
而『Model 參數』用來攜帶『回應頁面』要用到的資料
5.index.jsp設定
<html>
<head>
<title></title>
</head>
<body>
<form action="/hello.do">
請輸入名子:<input type="text" name="nameInput">
<input type="submit" value="傳送到一般的Spring">
</form>
<form action="/hello2.do">
請輸入名子:<input type="text" name="nameInput2">
<input type="submit" value="傳送到requestMapping">
</form>
</body>
</html>
6.hello.jsp設定<html>
<head>
<title></title>
</head>
<body>
<h1>This is Form Normal Spring:Hello ${nameInput}</h1><br>
<h1>This is From RequestMapping:Hello ${nameInput2}</h1>
</body>
</html>
7.使用基本Spring MVC 的Controllerpackage main;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by ytchen on 2016/9/22.
*/
public class MyController implements Controller{
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse res)
throws Exception {
//取得index.jsp輸入的名子
String name = req.getParameter("nameInput");
//參數1:要傳到哪個jsp;參數2:該物件的屬性名稱(前台取值用)參數3:要傳遞的物件或值
return new ModelAndView("hello", "nameInput", name);
}
}
8.使用@RequestMapping Spring 的Controller- 注意事項
- @RequestMapping 有2種標註方式,一種是標在class,一種是標在method。
- Class類別使用@Controller 標記為Controller
- 請參考:
http://www.blogjava.net/fancydeepin/archive/2014/08/15/springmvc-tutorial-02.html
http://www.cnblogs.com/zhangshitong/p/5195746.html
package main;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* Created by ytchen on 2016/9/22.
*/
@Controller
public class MyController2 {
@RequestMapping(value = "/hello2.do", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView hello(HttpServletRequest request) {
//取得index.jsp輸入的名子
String name = request.getParameter("nameInput2");
//將request傳到指定jsp
ModelAndView mav = new ModelAndView("hello");
mav.addObject("nameInput2", name);
return mav;
}
}
9.運行畫面a.index.jsp
b.按下傳送到一般的Spring
c.按下傳送到requestMapping
沒有留言:
張貼留言