Spring mvc 學習筆記(持續更新...)

Spring mvc 學習筆記

創建項目選擇spring MVC

相關配置

web.xml : 設置爲dispatcher處理

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
       version="4.0">
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

兩種方式實現訪問

1.xml實現訪問

dispatcher.xml:主要配置相關controller,包括路由,controller綁定等。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置路由-->
    <bean id="simpleUrlHandlerMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello">hello</prop>
            </props>
        </property>
    </bean>
    <!--配置映射-->
    <bean id="hello" class="controller.helloController"/>
</beans>

helloController實現,且需要在applicationContext.xml 開啓視圖解析器

package controller;


import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.annotation.Annotation;

public class helloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView("success");
        return modelAndView;
    }
}

2.註解實現路由配置

開啓視圖解析器和開啓註解支持,包掃描

<?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:mvc="http://www.springframework.org/schema/mvc"
     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/mvc
     http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <!--視圖解析器-->
  <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/pages/"/>    <!--前綴-->
      <property name="suffix" value=".jsp"/>    <!--後綴-->
  </bean>

  <!-- 開啓SpringMVC 框架的註解支持-->
  <mvc:annotation-driven/>

  <!--開啓包掃描,自動掃描包下所有註解-->
  <context:component-scan base-package="controller"/>

</beans>

controller標註註解,無需再配置dispatcher-servlet.xml文件,也可實現訪問

	package controller;

	import org.springframework.stereotype.Controller;
	import org.springframework.web.bind.annotation.RequestMapping;

	@Controller 			<<<<<-------
	public class helloController {
		
		@RequestMapping("/hello") 		<<<<<-------
		public String hello() {
			System.out.println("helloWorld");
			return "success";
		}
	}

多級路由( http://localhost:8080/demo/hello )

最開始我們的路由是 http://localhost:8080/hello 加上後:http://localhost:8080/demo/hello
實現:在類之前加上RequestMapping("/demo")

  @org.springframework.stereotype.Controller
  @RequestMapping("/demo") 			<<<<<-------
  public class democontroller implements Controller {

		@RequestMapping("/hello") 		<<<<<-------
		public String hello() {
			System.out.println("helloWorld");
			return "success";
		}
  }

REST風格

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KABJYhns-1571726378360)(:storage\7ddbe750-f51f-4e2d-81ba-fbc1d23e7137\215d522d.png)]

請求參數獲取

html數據輸入:

  <form action="${pageContext.request.contextPath}/login_do" method="post">
      user:<input type="text" name="userName">
      userPassword:<input type="text" name="userPassword">
      <input type="submit">
  </form>

controller獲取參數:

1.通過HttpServletRequest,HttpServletResponse 獲取數據(原生)

  @RequestMapping("/ServletApi")
  public String ServletApi(HttpServletRequest request, HttpServletResponse response) {
      System.out.println(request.getParameter("name") + request.getParameter("password"));
      return "success";
  }

2.使用@RequestParam獲取參數

  @RequestMapping("/login_do")
  public String login_do(@RequestParam(name = "userName") String name, @RequestParam(name = "userPassword")String password) {
      System.out.println(name + password);
      return "success";
  }

3.POJO作爲參數(bean對象)form表單的命名應該與bean的命名相同,且可以實現級聯屬性

級聯屬性(一個bean對象包含其他引用bean類型)實現:只需要在前端form表單中設置name屬性,並且在bean中設置相關的toString方法和setter,getter方法)
jsp頁面

    <form action="${pageContext.request.contextPath}/pojo" method="post">
        user:<input type="text" name="name">
        password:<input type="text" name="password">
        address:<input type="text" name="acc.address">		<<<<<---------
        money:<input type="text" name="acc.money">		<<<<<---------
        <input type="submit">
    </form>

controller實現

    @RequestMapping("/pojo")
    public String pojo(User u) {		<<<<<---------//自動封裝
        System.out.println(u);
        return "success";
    }

User bean 聲明

	package bean;

	public class User {
		private String name;
		private String password;
		private account acc;		<<<<<---------

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public String getPassword() {
			return password;
		}

		public void setPassword(String password) {
			this.password = password;
		}

		public account getAcc() {
			return acc;
		}

		public void setAcc(account acc) {
			this.acc = acc;
		}

		@Override
		public String toString() {
			return "User{" +
					"name='" + name + '\'' +
					", password='" + password + '\'' +
					", acc=" + acc +
					'}';
		}
	}

java bean對象的引用 account 申明

	package bean;

	public class account {
		private String money;
		private String address;

		public String getMoney() {
			return money;
		}

		public void setMoney(String money) {
			this.money = money;
		}

		public String getAddress() {
			return address;
		}

		public void setAddress(String address) {
			this.address = address;
		}

		@Override
		public String toString() {
			return "account{" +
					"money='" + money + '\'' +
					", address='" + address + '\'' +
					'}';
		}
	}

輸出結果

 User{name='comi', password='123', acc=account{money='1000000', address='cs'}}

4.封裝存爲list或map的集合

form 表單 處理
a) list

    phone:<input type="text" name="list[0].phone">
    address:<input type="text" name="list[0].address">

b) map

    phone:<input type="text" name="map['one'].phone">
    address:<input type="text" name="map['one'].address">

中文字符亂碼解決

<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>

Spring mvc 數據回顯(向jsp傳遞數據)

controller 設置相關數據

  @RequestMapping("/mv")
  public ModelAndView mv() {
      ModelAndView mav = new ModelAndView("success");
      mav.addObject("message", "Hello Spring MVC");
      return mav;
  }

jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" isELIgnored="false" %>

<h1>${message}</h1>

使用@ModelAttribute設置屬性,需要開啓註解支持才能生效

作用:ModelAttribute標記的方法會在每一個方法執行之前被SpringMVC調用

 //在啓動時直接設置相應的屬性,比如修改密碼操作,其他信息不變,只需要更新密碼,那麼就可以先查出之前的數據,在修改密碼並保存,無需new一個新的對象
 
  @ModelAttribute						<<<<------
  public void modelAttribute(Map<String,Object> map) {
  	// 在map中存入的數據key爲comi,則modelmadview中使用也需要相同的名字
      map.put("comi",new User("comi", "123456", new account("12000", "saijas")));			<<<<------
      System.out.println(map.get("comi"));
  }
  
  @RequestMapping("/mA") 				<<<<------
  public String testModelAttribute(User comi) {		<<<<------
      System.out.println(comi);
      return "success";
  }

SpringMVC 常用註解

1.@RequestParam(指明獲取的參數)
用於前後端協調參數名不一致時進行處理

    <%--前端參數名--%>
    user:<input type="text" name="myname">
    userPassword:<input type="text" name="mypassword">

後端處理

    public void UserBean(@RequestParam(name = "myname") String name,@RequestParam(name = "mypassword") String password){
        System.out.println(myname + mypassword);
    }

2.@RequestBody(指明獲得的數據爲請求體)
獲得整個請求體內容

    public void UserBean(@RequestBody String body){
        System.out.println(body);
    }

3.@PathVriable(獲取path的數據如:localhost:8080/user/{id}) 讀出佔位符id的數據

    @RequestMapping("/UserBean/{id}")
    public void UserBean(@PathVariable(name = "id") String id){
        System.out.println(id);
    }

4.@RequestMapping(設置路由及請求方法)

    @RequestMapping("/UserBean/{id}",method = Request.GET/Request.POST)       <<<<-------
    public void UserBean(@PathVariable(name = "id") String id){
        System.out.println(id);
    }

5.@Controller(標記類爲Controller對象,作用域:類)
6.@ModelAttribute(在方法執行前,執行一些操作)
7.@SessionAttributes(作用域:類)
  a) 設置session屬性

@SessionAttributes(value = {" msg "})    <<<<----
public class controller  {
    //實現方法中使用model存儲到request對象中去
    public void UserBean(Model model){
        model.addAttribute("msg","hello world");      <<<<----
    }
}
  

  前端頁面可以按照EL標籤的語法直接取值

${msg}

  b) ModelMap 可以取出 之前設定的 session

    public void UserBean(ModelMap modelMap){
        modelMap.get("msg");
    }

  c) 刪除session 屬性

    public void UserBean(SessionStatus status){
        status.setComplete();
    }

後臺響應請求

a)返回String 類型,常用Model 返回 String 數據

    public void UserBean(Model model){
      model.addAttribute("msg","hello world");
  }

b)響應轉發重定向(jsp的原生方式)
c)返回ModelAndView()

ModelAndView mav = new ModelAndView();
//將user存儲到mav對象和request對象中,
mav.addObject("user",new User("comi",18));
//頁面跳轉
mav.setViewName("index"); //在配置了視圖解析器的情況下,使用index,否則使用index.jsp

d)轉發和重定向
什麼是轉發?:轉發是服務器內部的跳轉,可以攜帶數據。
什麼是重定向?:重定向是關閉掉上一次的請求,發起一次新的請求!

  // 請求轉發
  return "forword:/WEB-INF/pages/success.jsp";
  //  重定向
  return "redirect:/index.jsp";

客戶端頁面跳轉

在controller下(無論該類是否實現Controller類)

@org.springframework.stereotype.Controller
public class hellocontroller{

    @RequestMapping(path = "/jump")    <<<<----指定path,否者無法進入處理方法,和value 一樣的效果
    public ModelAndView jump(){
        ModelAndView mav = new ModelAndView("redirect:/login");
        System.err.println("redirect!!"); 
        return mav;
    }
}

設置靜態資源可以被訪問

在dispatcher-servelt.xml 下設置添加

<!--設置js目錄下所有的資源都可以被訪問-->
<mvc:resources mapping="/js/**" location="/js/**"/>

ResponseBody 響應 json請求

前端設置ajax響應請求,後端使用@RequestBody接受參數

Spring mvc 異常處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章