文章目錄
springmvc中的註解
- @Controller :說明這是一個控制器,這個註解是通過<context:component-scan />來掃描的。
- @PathVariable(“uid”)Integer id:從請求路徑中取值。寫在變量類型前。將uid的值注入的id中。
- @RequestMapping :可以出現在類或方法上,若出現在類上,則請求的url爲 類上註解的 + 方法上@RequestMapping註解的地址。
- @RequestMapping除了可以使用url映射請求外,還可以使用請求方法、請求參數及請求頭映射請求。
- 值:value(請求路徑)、method(請求方法)、params(請求參數)、heads(請求頭)。
- params:
– param1:表示請求必須包含名爲param1的參數。
– !param1:表示請求中不可包含名爲param1的參數。
– param1!=hello:表示請求包含名爲param1的參數,但值不可以是hello。
– {“param1=hello”,“param2”} :表示請求中必須包含值爲hello的參數param1,與任意值的param2。 - 若類上的不寫,則url就是方法上@RequestMapping註解的url地址
- 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 + "]";
}
}
附:
- spirngmvc入門—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
- springmvc入門—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
- springmvc入門—springmvc的使用(3)interceptor攔截器:https://blog.csdn.net/qq_40366738/article/details/104905550