一、使用SpringMVC进行环境搭建
1、SpringMVC是Spring框架中用于Web应用开发的一个模块
,基于MVC设计模式的优秀Web开发框架,本质相当于Servlet,SpringMVC作为控制器,来建立模型与视图的数据交互,是一个典型的MVC框架。
2、Struts2MVC 和SpringMVC相比,为什么SpringMVC应用更加广泛??
3、搭建环境
(1)、创建动态工程SpringMVC42,勾选上添加xml文件。添加相关jar包
(2)、打开web.xml文件,配置Servlet相关文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SpringMVC42</display-name>
<!--
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
-->
<!-- 1.配置Servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 2.加载配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--3. 加载次序(优先级) -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 4. -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
扩展:有时候报错需要查看文件是否被编译
查看:window—》show View —-》Navigator
运行自动编译:project—》Build Automatically
(3)、创建SpringMVC-Servlet.xml文件,SpringMVC的配置文件。
首先配置头文件,然后在WEB-INF下建jsp文件夹
<?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:p="http://www.springframework.org/schema/p"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 1、视图解析器/映射器 把URL地址拼接,不需要全部输入 prefix前缀;suffix后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 2.name值是URL的请求地址;class是控制器类的全路径名 -->
<bean name="/index.html" class="cn.smbms.controller.IndexController"></bean>
</beans>
(4)、src下创建包—-》cn.smbms.controller包——》建IndexController类
package cn.smbms.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
//与实现servlet类似
public class IndexController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("进没进这个方法,看是否输出");
return new ModelAndView("index");
}
}
jsp包下创建index.jsp文件,放入标签,然后打开网页输入SpringMVC42/index.html测试
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello,SpringMVC!</h1>
</body>
</html>
4、当出现多个请求的时候,如何改进?
通过注解的方式,进行SpringMVC开发
首先,注掉springmvc-servlet中的第二条,然后添加注解的方法实现多个控制器映射
<?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:p="http://www.springframework.org/schema/p"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 1、视图解析器/映射器 把URL地址拼接,不需要全部输入 prefix前缀;suffix后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 2.name值是URL的请求地址;class是控制器类的全路径名
<bean name="/index.html" class="cn.smbms.controller.IndexController"></bean>
-->
<!-- 3.如果存在多个请求, 使用注解方法 实现多个控制器映射 -->
<context:component-scan base-package="cn.smbms"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
新建index2Controller类,用注解@Controller和@RequestMapping(“”)
package cn.smbms.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import cn.smbms.pojo.UserParam;
@Controller
//用作模块的划分,便于权限的管理
@RequestMapping("/idx")
public class Index2Controller {
Logger log = Logger.getLogger(Index2Controller.class);
//请求地址
@RequestMapping("/index2.html")
public String index2(){
log.info("是否进入这个方法");
return "index2";
}
}
新建index2.jsp界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>index2</h1>
</body>
</html>
在网页中输入网址http://127.0.0.1:8080/SpringMVC42/idx/index2.html实现显示
标签的index2
5、重点
(1)、SpringMVC构架的请求处理流程
(2)、SpringMVC架构的体系结构
模型图解
详解:
1、客户端发出http请求,web应用服务器接收此请求。若匹配DispatcherServlet的请求映射路径(在web.xml中指定),则web容器将该请求转交给DispatcherServlet处理。
2、DispatcherServlet接收到请求后,将根据请求的信息(包括URL,请求参数,http方法等)及HandlerMapping的配置(在
3、当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler,HandlerAdapter可以理解为具体使用Handler来干活的人,HandlerMapping接口里一共有三个方法,supports(Object);handler(HTTPServletRequest,HTTPServletResponse,Object);getLastModified(HTTPServletRequest,Object)
4、在请求信息到达真正调用handler的处理方法之前的这段时间,SpringMVC还完成了很多工作,它会将请求信息以一定的方式转换并绑定到请求方法的入参中,对于入参的对象会进行数据转换、数据格式化以及数据校验等操作。这些都做完才真正的调用Handler的处理方法进行相应的业务逻辑处理。
5、处理器完成业务逻辑处理之后,将返回一个ModelAndView对象给DispatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息
6、ModelAndView 对象中包含的是“逻辑视图名”,而非真正的视图对象。DispatcherServlet会通过ViewResolver将逻辑视图名解析为真正的视图对象View。当然,负责数据展示的视图可以是JSP、XML、PDF、JSON等多种数据格式,对此SpringMVC均可灵活配置。
7、当得到真实的视图对象View后,DispatcherServlet会使用ModelAndView对象中的模型数据对View进行视图渲染
8、最终客户端获得响应信息,可以是普通的HTML页面,也可以是一个XML或者JSON格式的数据等
6、前端往后端传值
index3
1、在index2Controller类中建index3传参方法,创建index3.jsp页面,在网页中打开。
在index3的方法中传入String name 参数,在url地址后面加上?name=toto,可在控制台上看打印结果
2、如果参数是String name1,只需要在前面加@RequestParam(value= “name”),这样就将参数name1和url中参数name映射到一起;
3、url参数想传就传,不想传就不传,只要新加属性required=false;//value参数名,required表示参数是否必须传递,默认为true(必须传递)
http://127.0.0.1:8080/SpringMVC42/idx/index3.html?name=toto
index4
4、传多个参数,详见index4
http://127.0.0.1:8080/SpringMVC42/idx/index4.html?name=toto&age=18
package cn.smbms.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import cn.smbms.pojo.UserParam;
@Controller
//用作模块的划分,便于权限的管理
@RequestMapping("/idx")
public class Index2Controller {
Logger log = Logger.getLogger(Index2Controller.class);
//请求地址
@RequestMapping("/index2.html")
public String index2(){
log.info("是否进入这个方法");
return "index2";
}
//SpringMVC传参
@RequestMapping("/index3.html")
//value参数名,required表示参数是否必须传递,默认为true(必须传递)
public String index3(@RequestParam(value="name",required=false)String name1){
System.out.println(name1);
return "index3";
}
//传递多个参数
@RequestMapping("/index4.html")
public String index4(String name,Integer age){
System.out.println(name);
System.out.println(age);
return "index4";
}
}
index3.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>index3</h1>
</body>
</html>
index4.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>index4</h1>
</body>
</html>
7、从后端往前端传值
index5
1.index5,后端设置name名,前端jsp${name}获取到name并显示;传英文或者中文都可以。
//后端往前段传参数
//第一种
@RequestMapping("/index5.html")
public ModelAndView index5(){
ModelAndView mav = new ModelAndView();
mav.addObject("name","韩美米");
//返回的视图名,跳转到哪个界面
mav.setViewName("index5");
return mav;
}
<!-- 后端往前端传,传普通类型 -->
<h1>index5 -> ${name}</h1>
http://127.0.0.1:8080/SpringMVC42/idx/index5.html
index6
2、index6,Model方法,由于跳转到index5,所以index5.jsp修改一下。
在网页打开index6.html;并加参数?name=toto
3、传对象,传实体对象,在cn.smbms下建pojo包,创建UserParam类;在Index2Controller中修改index6,和index5.jp
package cn.smbms.pojo;
//传递对象的方式
public class UserParam {
private String name;
private Integer age;
public UserParam(){
}
public UserParam(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
//第二种
@RequestMapping("/index6.html")
public String index6(String name,Model model){
//传对象类型
UserParam up = new UserParam("张三",18);
model.addAttribute("key1",name);
model.addAttribute("key2",up);
return "index5";
}
//jsp界面
<h1>index6 -> ${key1}</h1>
<!-- 后端往前端传,传对象类型 -->
<h1>index6 -> ${key2.name}--${key2.age}</h1>
http://127.0.0.1:8080/SpringMVC42/idx/index6.html?name=toto
index7
第三种,Index2Controller中加入index7方法,传入Map型参数;index5.jsp中修改
//第三种
@RequestMapping("/index7.html")
public String index7(Map<String, Object> map){
List<UserParam> list = new ArrayList<UserParam>();
list.add(new UserParam("李雷",12));
list.add(new UserParam("韩梅梅",15));
map.put("key3", list);
return "index5";
}
//index5.jsp
<!-- 后端往前端传,传复杂类型 Map,List,对象 -->
<h1>index7 -> ${key3[0].name}--${key3[0].age}|${key3[1].name}--${key3[1].age}</h1>
http://127.0.0.1:8080/SpringMVC42/idx/index7.html
8、练习3,完成View和Controller之间的参数传递
(1)、实现View和Controller之间的参数传递
(2)、在用户界面index8.jsp,提供输入型text框,输入用户编码userCode。
(3)、提交后跳转到success.jsp网页显示,显示输入的userCode
(4)、要求在控制台输出从前台获取的userCode的值
index2Controller类
//上机练习213页,前-》后-》前
@RequestMapping("/index8.html")
public String index8(String userCode){
return "index8";
}
@RequestMapping("/test.html")
public String success(Map<String, Object> map,String userCode){
System.out.println(userCode);
map.put("userCode", userCode);
return "success";
}
index8.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/SpringMVC42/idx/test.html">
<input type="text" name="userCode" id="userCode"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${userCode}</h1>
</body>
</html>