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>

展示结果:
在这里插入图片描述

发布了23 篇原创文章 · 获赞 5 · 访问量 1480

猜你喜欢

转载自blog.csdn.net/zj499063104/article/details/96317309