一、使用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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://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 {@Overrideprotected 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://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>




