SpringMVC基本使用
技術標籤:Spring MVCspringspringmvcjava
文章目錄
一、初步使用SpringMVC
建立一個dynamic web project,匯入相應的jar到WebContent/WEB-INF/lib目錄,jar示例:
接著在WEB-INF目錄下建立 web.xml,該檔案中配置充當DispatcherServlet的資訊,示例:
<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
然後在WEB-INF目錄下建立 springmvc-servlet.xml,將具體的訪問路徑與具體的Controller對應,示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index">indexController</prop>
</props>
</property>
</bean>
<bean id="indexController" class="controller.IndexController"></bean>
</beans>
建立 IndexController,用來處理具體的請求,在handleRequest方法裡,用ModelAndView 物件把模型和檢視結合在一起(表示檢視是index.jsp,模型資料是 message),示例:
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class IndexController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index.jsp");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
}
在WebContent目錄下建立index.jsp,用於顯示內容,示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<h1>${message}</h1>
接下來就可以進行測試了,訪問:
http://127.0.0.1:8080/springmvc/index
測試結果:
二、檢視定位
在上個小節中,inde.jsp檔案是直接建立WebContent目錄下的,我們可以規範些,改變一下其位置,比如在WEB-INF/page目錄下,首先就要在springmvc-servlet.xml指定一下.jsp檔案的位置,示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index">indexController</prop>
</props>
</property>
</bean>
<bean id="indexController" class="controller.IndexController"></bean>
</beans>
然後將IndexController類的這一行程式碼:
ModelAndView mav = new ModelAndView("index.jsp");
改成:
ModelAndView mav = new ModelAndView("index");
最後將index.jsp移動到 WEB-INF/page 目錄下,重新訪問:
http://127.0.0.1:8080/springmvc/index
結果依然與之前一樣:
三、使用註解
前面的小節都是用配置檔案的方式實現功能的,接下來試試註解的方式。首先在Controller中獎賞註解,表明註解的名稱對應的訪問路徑,示例:
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController {
@RequestMapping("/index")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
}
接下來在springmvc-servlet.xml中加入下面一句:
<context:component-scan base-package="controller" />
表明從包controller下掃描有@Controller註解的類,示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<context:component-scan base-package="controller" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
重新訪問:
http://127.0.0.1:8080/springmvc/index
結果依然與之前一樣。
四、接受表單資料
瀏覽器提交資料是非常常見的場景,本小節演示Spring MVC如何接受資料。先建立實體類:
package pojo;
public class Product {
private int id;
private String name;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
然後在WebContent目錄下 增加商品的頁面addProduct.jsp,用於使用者填寫資料,示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<form action="addProduct">
產品名稱 :<input type="text" name="name" value=""><br />
產品價格: <input type="text" name="price" value=""><br />
<input type="submit" value="增加商品">
</form>
接著建立控制器ProductController,準備一個add方法對映/addProduct路徑
,為add方法準備一個Product 引數,用於接收注入,最後跳轉到showProduct頁面顯示使用者提交的資料。示例:
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import pojo.Product;
@Controller
public class ProductController {
@RequestMapping("/addProduct")
public ModelAndView add(Product product) throws Exception {
ModelAndView mav = new ModelAndView("showProduct");
return mav;
}
}
在上面的程式碼中, addProduct.jsp 提交的name和price會自動注入到引數 product裡, 引數product會預設被當做值加入到ModelAndView 中,相當於:
mav.addObject("product",product);
在WEB-INF/page 目錄下建立 showProduct.jsp,用於顯示使用者提交的資料:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
產品名稱: ${product.name}<br>
產品價格: ${product.price}
接下來就可以進行測試,訪問:
http://127.0.0.1:8080/springmvc/addProduct.jsp
介面為:
隨便輸入一些商品資訊,如:“Phone”、“3000”,就可以看到如下介面:
五、客戶端跳轉
之前的小節裡都是服務端跳轉,本小節演示如何進行客戶端跳轉。
修改IndexController,示例:
@Controller
public class IndexController {
@RequestMapping("/index")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
@RequestMapping("/jump")
public ModelAndView jump() {
ModelAndView mav = new ModelAndView("redirect:/index");
return mav;
}
}
然後訪問:
http://127.0.0.1:8080/springmvc/jump
測試結果:
六、Session
此處簡單從Session中獲取count屬性,然後自增1,並顯示到頁面上,先修改IndexController檔案為:
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController {
@RequestMapping("/index")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
@RequestMapping("/jump")
public ModelAndView jump() {
ModelAndView mav = new ModelAndView("redirect:/index");
return mav;
}
@RequestMapping("/check")
public ModelAndView check(HttpSession session) {
Integer i = (Integer) session.getAttribute("count");
if (i == null)
i = 0;
i++;
session.setAttribute("count", i);
ModelAndView mav = new ModelAndView("check");
return mav;
}
}
接著在page目錄下新建check.jsp,示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
session中記錄的訪問次數:${count}
訪問如下地址:
http://127.0.0.1:8080/springmvc/check
沒重新整理一次,訪問次數就會+1。
七、中文問題
在之前的提交表單時,我們沒有輸入中文資訊,那假如我們輸入"手機"、"3000"會顯示什麼呢?如下:
很明顯,編碼格式需要處理。首先要修改web.xml,支援中文編碼,示例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
接著修改addProduct.jsp,為form 設定method=“post”,示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<form action="addProduct" method="post">
產品名稱 :<input type="text" name="name" value=""><br />
產品價格: <input type="text" name="price" value=""><br />
<input type="submit" value="增加商品">
</form>
重新測試,就發現支援中文了,測試結果:
八、上傳檔案
首先要在web.xml中增加對上傳圖片的相關配置,比如格式等,此處以jpg為例,並且關於上傳圖片的配置需要加在springmvc的servlet之前,示例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<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>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
然後需要springmvc-servlet.xml增加一些配置,開放對上傳功能的支援,示例:
<?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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="controller" />
<bean id="irViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>
接著在WebContent目錄下,建立upload.jsp,用於上傳圖片,示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<form action="uploadImage" method="post" enctype="multipart/form-data">
選擇圖片:<input type="file" name="image" accept="image/*" /> <br>
<input type="submit" value="上傳">
</form>
圖片上傳後,自然要接受這張圖片,示例:
package pojo;
import org.springframework.web.multipart.MultipartFile;
public class UploadedImageFile {
MultipartFile image;
public MultipartFile getImage() {
return image;
}
public void setImage(MultipartFile image) {
this.image = image;
}
}
需要注意的是:在UploadedImageFile中封裝MultipartFile型別的欄位 image ,用於接受頁面的注入。這裡的欄位 image必須和上傳頁面upload.jsp中的image
< input type=“file” name=“image” accept=“image/*” />保持一致。
接著就要建立一個Controller,來負責實現接受圖片、傳給介面等功能,示例:
package controller;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.xwork.RandomStringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import pojo.UploadedImageFile;
@Controller
public class UploadController {
@RequestMapping("/uploadImage")
public ModelAndView upload(HttpServletRequest request, UploadedImageFile file)
throws IllegalStateException, IOException {
String name = RandomStringUtils.randomAlphanumeric(10);
String newFileName = name + ".jpg";
File newFile = new File(request.getServletContext().getRealPath("/image"), newFileName);
newFile.getParentFile().mkdirs();
file.getImage().transferTo(newFile);
ModelAndView mav = new ModelAndView("showUploadedFile");
mav.addObject("imageName", newFileName);
return mav;
}
}
在上述程式碼中:
- 方法的第二個引數UploadedImageFile 中已經注入好了 image
- 通過 RandomStringUtils.randomAlphanumeric(10);獲取一個隨機檔名。 因為使用者可能上傳相同檔名的檔案,為了不覆蓋原來的檔案,通過隨機檔名的辦法來規避
- 根據request.getServletContext().getRealPath 獲取到web目錄下的image目錄,用於存放上傳後的檔案。
- 呼叫file.getImage().transferTo(newFile); 複製檔案
- 把生成的隨機檔名提交給檢視,用於後續的顯示
最後,在WEB-INF/page 下新建檔案showUploadedFile.jsp 顯示上傳的圖片:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<img src="image/${imageName}"/>
訪問如下地址:
http://127.0.0.1:8080/springmvc/upload.jsp
顯示的介面為:
然後選擇jpg檔案進行上傳,即可在網頁上顯示。
本文內容均參考HOW2J.CN。