SSM框架(Spring + SpringMVC + MyBatis)學習筆記(1),第二課:SpringMVC

一、Spring MVC 工作流程圖
在這裏插入圖片描述
二、配置DespatcherServlet

  1. 配置路徑:WebContent/WEB-INF/web.xml
    web.xml文件路徑
  2. 配置內容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>springmvctest</display-name>
  
  <servlet>
  	<!-- 值與servlet-mapping中servlet-name的值一致 -->
  	<servlet-name>mvctest</servlet-name>
  	<!-- 相應的jar包路徑,固定值 -->
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<!-- 固定配置 -->
  		<param-name>contextConfigLocation</param-name>
  		<!-- applicationContext.xml文件路徑,classpath表示src路徑 -->
  		<param-value>classpath:applicationContext.xml</param-value>
  	</init-param>
  	<!-- 表示這個servlet加載優先級,數字越小,優先級越高;
  	另外這個servlet會在項目啓動的時候就加載,如果沒有這行,則在實際觸發的時候執行 -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<!-- 值與servlet中servlet-name的值一致 -->
  	<servlet-name>mvctest</servlet-name>
  	<!-- 請求類型以.do結尾的都會走這個servlet -->
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

三、示例jsp文件:hello.jsp

  1. 新建hello.jsp,路徑:WebContent/WEB-INF/hello.jsp
    hello.jsp
  2. hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>spring mvc 入門示例</h2>
	<h3>${msg }</h3>
</body>
</html>

四、編寫Controller

  1. 新建HelloController類,目錄:cn/springmvc/controller/HelloController.java
    在這裏插入圖片描述
  2. Controller類必須繼承Controller
package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
 * controller必須繼承Controller
 * @author ZJ
 *
 */
public class HelloController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse respone) throws Exception {
//		ModelAndView mav = new ModelAndView();
//		mav.setViewName("hello");//設置視圖名字,調用這個類的時候就會把這個類的返回值,傳遞給名字爲hello的視圖
		ModelAndView mav = new ModelAndView("hello");//以上兩步合一步,效果一樣
		mav.getModel().put("msg", "向頁面傳遞一個值");
		return mav;
	}

}

五、在applicationContext.xml中配置HandlerMapping

<!-- 配置HandlerMapping,class路徑爲jar包路徑,並且路徑不能換行-->
<bean id="handlerMapping" 
	class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<!-- name="mappings"爲固定值,不可改變 -->
	<property name="mappings">
		<props>
			<!-- key:請求localhost:8080/springmvctest/hello.do中的hello.do value:Controller的id值 -->
			<prop key="hello.do">helloController</prop>
		</props>
	</property>
</bean>

六、在applicationContext.xml中配置Controller

<!-- 配置Controller -->
<bean id="helloController" class="cn.springmvc.controller.HelloController"></bean>

七、在applicationContext.xml中配置ViewResolver

<!-- 配置ViewResolver,class路徑爲jar包路徑,並且路徑不能換行 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<!-- 視圖的位置前半部分 -->
	<property name="prefix" value="/WEB-INF/"/>
	<!-- 視圖的格式 -->
	<property name="suffix" value=".jsp"/>
</bean>

到此以上已經能夠通過Spring MVC實現hello頁面的展示,效果如圖所示
在這裏插入圖片描述

以下將介紹:使用註解配置實現以上功能

新建web工程,引入jar包,加入配置文件applicationContext.xml

一、配置DispatchServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>springmvctest01</display-name>
  
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:applicationContext.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

二、在applicationContext.xml中配置HandleMapping

<!-- 配置HandleMapping -->
<mvc:annotation-driven/>

三、在applicationContext.xml中配置Controller

<!-- 配置Controller -->
<context:component-scan base-package="cn.springmvc.controller"/>

四、在applicationContext.xml中配置ViewResolver

<!-- 配置ViewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

五、創建hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	Spring MVC 註解版
	${msg }
</body>
</html>

六、創建Controller

package cn.springmvc.controller;

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

@Controller
public class HelloController {
	
	@RequestMapping("/hello.do")
	public ModelAndView execute() {
		ModelAndView mav = new ModelAndView("hello");
		mav.getModel().put("msg", "向頁面傳遞一個值");
		return mav;
	}
}

到此以上通過Spring MVC 註解實現hello頁面的展示,效果如圖所示
在這裏插入圖片描述

以下將介紹:Controller如何接收請求參數

創建login.jsp,請求參數爲username, password

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<h2>用戶登陸</h2>
	<form action="checkLogin.do" method="post">
		用戶名:<input type="text" name="username"><br/>&nbsp;&nbsp;&nbsp;&nbsp;碼:<input type="text" name="password"><br/>
		<input type="submit" value="登陸">
	</form>
</body>
</html>

創建ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>登陸成功</h2>
</body>
</html>

一、通過HttpServletRequest
創建LoginController.java

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;

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

@Controller
public class LoginController {
	
	@RequestMapping("/checkLogin.do")
	//通過HttpServletRequest接收請求參數
	public String checkLogin(HttpServletRequest request) {
		if("root".equals(request.getParameter("username")) 
				&& "1234".equals(request.getParameter("password"))) {
			return "ok";
		}
		return "login";
		
	}
}

二、利用業務方法參數
–方法參數名與請求參數key保持一致
–利用@RequestParam(“key”)

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;

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

@Controller
public class LoginController {
	
	//利用業務方法參數,方法參數名必須與請求參數的key保持一致,
	//不一致的情況下可以通過@RequestParam("key")
	@RequestMapping("/checkLogin1.do")
	public String checkLogin1(@RequestParam("username")String name, String password) {
		if("root".equals(name) && "1234".equals(password)) {
			return "ok";
		}
		return "login";
	}
	
	
}

三、利用實體對象當方法參數
創建實體對象User

package cn.springmvc.entity;

public class User {
	//屬性必須和請求參數保持一致
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

創建LoginController.java

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;

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

import cn.springmvc.entity.User;

@Controller
public class LoginController {
	//利用實體對象當方法參數
	@RequestMapping("/checkLogin2.do")
	public String checkLogin(User user) {
		if("root".equals(user.getUsername()) && "1234".equals(user.getPassword())) {
			return "ok";
		}
		return "login";
	}
	
}

使用建議:
少量參數使用二;
大量參數使用三;
如果客戶端表單數據沒有格式檢查,遇到非字符串類型參數建議使用一

以下將介紹:Controller如何向響應JSP傳值

ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
controller向jsp傳遞的值:${msg }
	<h2>登陸成功</h2>
</body>
</html>

一、利用HttpServletRequest

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;

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

import cn.springmvc.entity.User;

@Controller
public class LoginController {
	
	@RequestMapping("/checkLogin.do")
	//通過HttpServletRequest接收請求參數
	public String checkLogin(HttpServletRequest request) {
		if("root".equals(request.getParameter("username")) 
				&& "1234".equals(request.getParameter("password"))) {
			//利用HttpServletRequest向頁面傳遞值
			request.setAttribute("msg", request.getParameter("username"));
			return "ok";
			
		}
		return "login";
		
	}
	
}

二、利用ModelAndView做返回值

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;

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

import cn.springmvc.entity.User;

@Controller
public class LoginController {
	
	//利用ModelAndView做返回值,向頁面傳遞值
	@RequestMapping("/checkLogin3.do")
	public ModelAndView checkLogin(String username, String password) {
		ModelAndView mav = new ModelAndView();
		if("root".equals(username) && "1234".equals(password)) {
			mav.setViewName("ok");
			mav.getModel().put("msg", username);
		}else {
			mav.setViewName("login");
		}
		return mav;
	}
	
}

三、利用ModelMap方法參數

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;

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

import cn.springmvc.entity.User;

@Controller
public class LoginController {
	
	//利用ModelMap方法參數,向頁面傳遞參數
	@RequestMapping("/checkLogin4.do")
	public String checkLogin4(String username, String password, ModelMap model) {
		if("root".equals(username) && "1234".equals(password)) {
			model.put("msg", username);
			return "ok";
		}
		return "login";
	}
	
}

四、使用session來保存數據

package cn.springmvc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

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

import cn.springmvc.entity.User;

@Controller
public class LoginController {
	
	//使用session來保存數據,向頁面傳遞參數
	@RequestMapping("/checkLogin4.do")
	public String checkLogin4(String username, String password, HttpSession session) {
		if("root".equals(username) && "1234".equals(password)) {
			session.setAttribute("msg", username);
			return "ok";
		}
		return "login";
	}
	
}

練習:列表展示

創建:ListController.java

package cn.springmvc.controller;

import java.util.ArrayList;
import java.util.List;

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

import cn.springmvc.entity.User;

@Controller
public class ListController {
	
	@RequestMapping("/list.do")
	public ModelAndView listShow() {
		List<User> list = new ArrayList<User>();
		for(int i=0;i<10;i++) {
			User user = new User();
			user.setUsername("root"+i);
			user.setPassword("0000"+i);
			list.add(user);
		}
		ModelAndView mav = new ModelAndView("list");
		mav.getModel().put("list", list);
		return mav;
	}
}

創建list.jsp
注意:使用<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>這個標籤,需要在WEB-INF/lib下引入jstl.jar, standard.jar

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>成員列表</h2>
	<table>
		<tr>
			<td>姓名</td>
			<td>密碼</td>
		</tr>
		<c:forEach items="${list }" var="user">
			<tr>
				<td>${user.username }</td>
				<td>${user.password }</td>
			</tr>
		
		</c:forEach>
	
	</table>
</body>
</html>

展示結果:
在這裏插入圖片描述

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