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接受參數