springmvc入門—springmvc的使用(2)

springmvc中的註解

  • @Controller :說明這是一個控制器,這個註解是通過<context:component-scan />來掃描的。
  • @PathVariable(“uid”)Integer id:從請求路徑中取值。寫在變量類型前。將uid的值注入的id中。
  • @RequestMapping :可以出現在類或方法上,若出現在類上,則請求的url爲 類上註解的 + 方法上@RequestMapping註解的地址。
  1. @RequestMapping除了可以使用url映射請求外,還可以使用請求方法、請求參數及請求頭映射請求。
  2. 值:value(請求路徑)、method(請求方法)、params(請求參數)、heads(請求頭)。
  3. params:
    – param1:表示請求必須包含名爲param1的參數。
    – !param1:表示請求中不可包含名爲param1的參數。
    – param1!=hello:表示請求包含名爲param1的參數,但值不可以是hello。
    – {“param1=hello”,“param2”} :表示請求中必須包含值爲hello的參數param1,與任意值的param2。
  4. 若類上的不寫,則url就是方法上@RequestMapping註解的url地址
  5. REST風格:(Representational State Transfer)資源表現層轉化。是當前流行的一中互聯網軟件架構。特點:清晰、易懂、複合標準、方便擴展。
    Resources:資源。網絡上的實體。一個URI(統一資源定位符)對應一個資源。
    Representation:表現層。把資源具體呈現的形式。txt、html、xml、json、二進制。
    State Transfer:狀態轉化。每個請求表示客戶端與服務器的交互過程。HTTP是一個無狀態協議,所有狀態保存在服務器。so,客戶端要操作服務器,需要通過一定手段,使服務器發生“狀態轉化”。
    在這裏插入圖片描述

1. 導入相關依賴包

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<maven.compiler.source>1.8</maven.compiler.source>
	<maven.compiler.target>1.8</maven.compiler.target>
	<spring.version>5.2.3.RELEASE</spring.version>
</properties>
<dependencies>
	<!-- spring的依賴包 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<!-- json包 -->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.9.8</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-core</artifactId>
		<version>2.9.8</version>
		</dependency>
	<!-- servlet 和 jsp -->
	<dependency>
		<groupId>javax.servlet.jsp</groupId>
		<artifactId>javax.servlet.jsp-api</artifactId>
		<version>2.3.3</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>4.0.0</version>
		<scope>provided</scope>
	</dependency>
</properties>

2. 配置web.xml

<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置請求的分發器 -->
<servlet>
	<servlet-name>DispathcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>	<!-- 初始化參數 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring-mvc.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>DispathcherServlet</servlet-name>
	<!--/*會攔截所有頁面,會導致jsp頁面顯示代碼,但/不會攔截*.jsp這樣的頁面 -->
	<url-pattern>/</url-pattern>
</servlet-mapping>

index.html頁面與項目目錄結構

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <a href="demo/find1">FIND1 no param</a> </h1>
<h1> <a href="demo/find1?usid=1001">FIND1 usid=1001</a> </h1>
<h1> <a href="demo/find2">FIND2</a> </h1>
<h1> <a href="demo/find3/1001/huathy">FIND3 1001 huathy</a> </h1>
<hr/>
<h1> <a href="test1">TEST1</a> </h1>
<h1> <a href="test2">TEST2</a> </h1>
<h1> <a href="index1.html">INDEX1</a> </h1>
<h1> <a href="index2">INDEX2</a> </h1>
<hr>
<h1> <a href="json1">JSON1</a> </h1>
<h1> <a href="json2">JSON2</a> </h1>
<h1> <a href="json3">JSON3</a> </h1>
</body>
</html>

目錄結構與其他子頁面
在這裏插入圖片描述

4. 返回地址的案例

4-1. DemoController.java

@Controller
@RequestMapping("/demo")
public class DemoController {
	/**
	 * 此時該方法返回值回當作視圖地址
	 * @param usid
	 * @return
	 */
	@RequestMapping("/find1")
	public String find1(Integer usid){
		System.out.println(usid);
		//默認回使用內部轉發跳轉地址,若加上redirect會使用重定向跳轉頁面
		//若視圖地址以“/”開頭,則表示採用相對於項目開始的“絕對路徑”。即這個路徑從項目開始算。
		//若不以“/”開頭,則說明採用相對於請求地址的相對路徑。即以地址欄中的請求爲起點。
		return "redirect:/back/find1.html";
	}
	
	@RequestMapping(value="/find2")
	public String find2(){
		return "find2";		//這種寫法需要在spirngmvc.xml中<!-- 配置視圖信息 -->
	}
	
	//要求使用GET請求方式,地址欄攜帶參數
	@RequestMapping(method=RequestMethod.GET,value="/find3/{uid}/{uname}")
	public String find3(@PathVariable("uid")Integer id,@PathVariable("uname")String uname){
		System.out.println( id +"\t"+ uname );
		return "find2";		//這種寫法需要在spirngmvc.xml中<!-- 配置視圖信息 -->
	}
}

4-2. spingmvc.xml配置

<!-- 配置註解掃描器 -->
<context:component-scan base-package="com.hx.spring.mvc" />
<!-- 放過靜態資源 -->
<mvc:default-servlet-handler />
<!-- 啓用mvc註解 , 掃描註解@RequestMapping、@ResponseBody...-->	
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/back/" />
	<property name="suffix" value=".html" />
	<property name="order" value="0"></property>
</bean>

5. 返回ModelAndView的案例

5-1. 編寫TestController.java

package com.hx.spring.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TestController {
	@RequestMapping("/test1")
	public ModelAndView test1(){
		ModelAndView mav = new ModelAndView("/back/index1.jsp");	//這裏跳轉頁面需要刪除上面xml配置的視圖信息
		mav.addObject("company","HUATHY科技");
		return mav;		//這裏可能回發現jsp頁面代碼直接顯示的問題
		//則需注意本文第2點中的web.xml中的<url-pattern>/</url-pattern>,斜槓後不要帶*號
	}
	
	@RequestMapping("/test2")
	public ModelAndView test2(){
		ModelAndView mav = new ModelAndView();
		mav.setViewName("/back/index2.jsp");	//這裏跳轉頁面需要刪除上面xml配置的視圖信息
		mav.addObject("company","HUATHY科技");
		mav.addObject("name","HUATHY");
		return mav;
	}

	//若沒有指定view,何?
	//若spring-mvc.xml中配置了視圖信息,那麼會根據以下規則配置視圖名稱
	//根據請求路徑來
	//若是  ../<項目名>/index1			->		此時視圖名是index1
	//若是  ../<項目名>/index1.html	->		此時視圖名是index1,會自動刪除擴展名
	//若是  ../<項目名>/index1			->		此時視圖名是/back/index1
	@RequestMapping("/index1.html")
	public ModelAndView index1(){
		ModelAndView mav = new ModelAndView();
		mav.addObject("company","HUATHY科技");
		return mav;		
	}

	@RequestMapping("index2")
	public String index2(Model model){
		model.addAttribute("company","HUATHY科技");
		model.addAttribute("name","HUATHY");
		return "/index2";
		//這裏我要訪問的是index2.jsp,需要配置視圖信息,見本文第5-2點
	}
}

5-2. 修改spirng.mvc配置

<!--這裏把“.html” 替換成 “.jsp”-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/back/" />
	<property name="suffix" value=".html" />
</bean>

6.返回JSON格式的案例

這裏必須在pom.xml中導入json包。

6-1 編寫JsonController.java

package com.hx.spring.mvc.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.hx.spring.mvc.entity.Person;
/*
 * @ResponseBody註解告訴框架,將這個返回值當作正文返回。
 * 那麼這時若遇到對象,則必須使用對應的converter進行轉換,一般是轉成字符串進行返回
 * 爲什麼要轉成String? 這時需要從請求頭中獲取Accept信息。Accept可以使用逗號分割定義多個類型。
 * 用來告訴服務器我只接受的類型響應
 * AnnotationMethodHandlerAdapter中同樣注入多個HttpMessageConverter,每個HttpMessageConverter都可以定義各自的supportedMediaTypes。
 * HttpMessageConvert來完成對象到文本的序列化操作
 */
@RestController		//相當於@Controller  +  @ResponseBody
public class JsonController {
	
	@RequestMapping("/json1")
	public Person find1(){
		return new Person(101,"HUATHY",16,"1234567789");
	}
	
	@RequestMapping("/json2")
	public List<Person> find2(){
		List<Person> list = new ArrayList<Person>();
		list.add( new Person(101,"HUATHY",16,"1234567789") );
		list.add( new Person(102,"huasy",16,"1234567789") );
		list.add( new Person(103,"XQ",16,"1234567789") );
		return list;
	}
	
	@RequestMapping("/json3")
	public Map<String,Object> find3(){
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("company", "HUATHY");
		map.put("name", "HUASY");
		return map;
	}
	
}

6-2編寫Person.java

@Component
public class Person {
	private int pid;
	private String pname;
	private int age;
	private String tel;
	
	public int getPid() {
		return pid;
	}
	public void setPid(int pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + pid;
		result = prime * result + ((pname == null) ? 0 : pname.hashCode());
		result = prime * result + ((tel == null) ? 0 : tel.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (pid != other.pid)
			return false;
		if (pname == null) {
			if (other.pname != null)
				return false;
		} else if (!pname.equals(other.pname))
			return false;
		if (tel == null) {
			if (other.tel != null)
				return false;
		} else if (!tel.equals(other.tel))
			return false;
		return true;
	}
	public Person(int pid, String pname, int age, String tel) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.age = age;
		this.tel = tel;
	}
	public Person() {
		super();
	}
	
	@Override
	public String toString() {
		return "Person [pid=" + pid + ", pname=" + pname + ", age=" + age + ", tel=" + tel + "]";
	}
}

附:

  1. spirngmvc入門—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
  2. springmvc入門—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
  3. springmvc入門—springmvc的使用(3)interceptor攔截器:https://blog.csdn.net/qq_40366738/article/details/104905550
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章