Spring实现步骤
- 新建web maven工厂
- 加入依赖
spring-mvc依赖,间接把spring的依赖都加入到项目
jsp,servlet依赖 - 重点:在web.xml注册springmvc框架的核心对象DispatcherServlet
1.DispatherServlet:中央调度器是一个servlet,父类是HttpServlet
2.DispatherServlet:也叫前端控制器
3.DispatherServlet:负责接受请求,调用其他控制器对象,并把请求返回给用户。
4.创建一个发起请求的页面 index.jsp
5.创建控制器类
- 1. 在类上面加入@Controller注解,创建对象,并放入到springmvc容器中。
- 2. 在类中的方法上面加入@RequestMapping注解
6.创建一个作为结果的jsp,显示请求的处理结果。
7.创建springmvc的配置文件(spring的配置文件一模一样)
- 1.声明组件扫描器,指定@Controller注解所在的包名。
- 2.声明视图解析器,帮组处理视图的。
springmvc 配置
- web.xml
<?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">
<!-- 注册springMVC的核心对象DispatherServlet-->
<!-- 需要在tomcat服务器启动后创DispatherServlet实例-->
<!-- 为什么要创建DispatherServlet对象的实例呢
通过DispatherServlet在他创建过程中,会同时创建springmvc容器对象
读取springmvc的配置文件,吧这个配置文件中的对象都创建好,当用户发起请求
就可直接使用对象了
servlet的初始化会执行init()方法.DispatherServlet在init()中
创建容器 读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext("SpringMVC.xml");
// 把容器对象放入ServletContext中
getServletContext().setAttribute(key, ctx);
报错: /WEB-INF/springmvc-servlet.xml
/WEB-INF/myWeb-servlet.xml
原因是: springmvc在创建容器对象时
默认读取的是/WEB-INF/<servlet-name>-servlet.xml
-->
<servlet>
<servlet-name>myWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 自定义springmvc配置文件的位置-->
<init-param>
<!-- springmvc的配置文件的位置的属性-->
<param-name>contextConfigLocation</param-name>
<!-- 指定自定义文件的位置-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在tomcat启动后,创建servlet对象
load-on-startup: 表示tomcat启动后创建对象的顺序
它的值士整数,数值越小,tomcat创建对象的时间越早。
大于等于0的整数
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myWeb</servlet-name>
<!-- 使用框架的时候,url-pattern可以使用两种方式-->
<!-- 1. 使用扩展名, 使用*.xx , xxx是自定义的扩展名。-->
<!-- 常用*.do 等等
2. 使用斜杠 */
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
- resrouce/springmvc.xml配置
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 声明组件扫描器-->
<context:component-scan base-package="com.study.controller"/>
<!-- 声明 springmvc框架中的视图解析器, 帮助开发人员设置视图文件的路径、-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀: 视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- Controller类
/**
* 表示一个控制器对象
* 位置在类上面
* 和spring中讲的@Service, @Component一样
*/
@Controller
public class MyController {
/**
* 处理用户提交的请求,springmvc是用方法来处理的
* 方法是自定义的,可以有多种返回值,多种参数, 方法名自定义
*/
/**
* @RequestMapping 请求映射
* 作用: 把一个请求和一个方法绑定在一起
* 属性: 1. value是一个String, 表示url地址的(some.do)
* value 的值必须是唯一的, 不能重复. 在使用时, 推荐地时以"/"
* 说明: 使用RequestMapping修饰的方法叫做处理器方法,或者说控制器方法。
* 类似于servlet的doGet, doPost.
* 返回值: ModelAndView
* Model:要显示给用户的数据
* View : 返回jsp等.
*/
@RequestMapping(value = "/some.do")
public ModelAndView dosome(){ // doGet()
ModelAndView mv = new ModelAndView();
// 添加数据 , 框架最后吧数据放入request作用域
// request.setAttribute("fun","执行完成");
mv.addObject("msg", "欢迎使用springmvc");
mv.addObject("fun", "执行dosmome方法");
// 指定视图
// 框架对视图执行的是forward.
mv.setViewName("/show.jsp");
return mv;
}
}
- spring.xml 配置文件 扫描包 创建对象
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.lz.controller"/>
</beans>
- view层 show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>show.jsp</h3>
<p>msg数据:${requestScope.msg}</p>
<p>fun数据:${requestScope.fun}</p>
</body>
</html>
springmvc的处理流程:
-
用户发起请求 -> tomcat -> tomcat读取web.xml更具映射规则*.do给中央调度器DispatherServlet(根据springmvc.xml配置文件 知道some.do - > dosome()方法)- >DispatherServlet吧some.do装法给MyController.dosome() - > 方法返回ModelAndView
如何访问WEB-INF/view目录下的jsp或者其他页面
即保证了用户直接访问,又解决的无法转发的问题。
mv.setViewName("/WEB-INF/view/show.jsp");
-
视图解析器:
<!-- 声明 springmvc框架中的视图解析器, 帮助开发人员设置视图文件的路径、-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀: 视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
@Controller
public class MyController {
/**
* 处理用户提交的请求,springmvc是用方法来处理的
* 方法是自定义的,可以有多种返回值,多种参数, 方法名自定义
*/
/**
* @RequestMapping 请求映射
* 作用: 把一个请求和一个方法绑定在一起
* 属性: 1. value是一个String, 表示url地址的(some.do)
* value 的值必须是唯一的, 不能重复. 在使用时, 推荐地时以"/"
* 说明: 使用RequestMapping修饰的方法叫做处理器方法,或者说控制器方法。
* 类似于servlet的doGet, doPost.
* 返回值: ModelAndView
* Model:要显示给用户的数据
* View : 返回jsp等.
*/
@RequestMapping(value = "/some.do")
public ModelAndView dosome(){ // doGet()
ModelAndView mv = new ModelAndView();
// 添加数据 , 框架最后吧数据放入request作用域
// request.setAttribute("fun","执行完成");
mv.addObject("msg", "欢迎使用springmvc");
mv.addObject("fun", "执行dosmome方法");
// 指定视图
// 框架对视图执行的是forward.
// mv.setViewName("/WEB-INF/view/show.jsp");
// 配置了视图解析器后用逻辑名称指定视图
// 框架自动把前缀和逻辑名称和视图进行字符串拼接
mv.setViewName("show");
return mv;
}
}
- controller
@RequestMapping(value = {"/some.do","/second.do"})
@RequestMapping("")可以定义在类上把公共的部分放在类上。形成层级例如 /first/metod.do
RequestMapping() Method属性
- 控制请求方式
//使用的是枚举形式
@RequestMapping(value = "/some.do", method = RequestMethod.POST)
如果没有设置则什么形式的访问都行
接受前台数据
// 接受前端参数
@RequestMapping(value = "/first.do")
public ModelAndView doFirst(HttpServletRequest req,
HttpServletResponse resp,
HttpSession session){
ModelAndView mv = new ModelAndView();
mv.addObject("msg", req.getParameter("name"));
mv.setViewName("other");
return mv;
}
逐个接受form表单
<form action="properties.do" method="post">
姓名: <input type="text" name="name">
年龄: <input type="text" name="age">
<input type="submit" value="提交参数">
</form>
// 逐个接受 需要方法参数与请求名字一一对应 并且一样
@RequestMapping(value = "properties.do")
/**
* 框架会提供类型转型功能,能把String 转换为 int float double类型
*/
public ModelAndView proper(String name, int age){
ModelAndView mv = new ModelAndView();
mv.addObject("myAge", age);
mv.addObject("myName", name);
mv.setViewName("properties");
return mv;
}
}
int 换成 Integer更好 容错 也可以全部写String
- post方式请求 解决乱码
get请求没有乱码 post请求会有中文乱码
1. 在每个方法前面加Request.getCharacterEncoding("utf-8");
2. 使用过滤器解决
- web.xml 过滤器解决乱码问题
<!-- 注册过滤器, 解决乱码问题-->
<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>
<!-- 强制请求对象使用上面的编码格式-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!-- 强制应答对象使用上面编码格式-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 强制所有请求先通过过滤器-->
<url-pattern>/*</url-pattern>
</filter-mapping>
@RequestMapping
- 请求参数和处理器方法的形参名不一样时用
解决请求中参数名形参名不一样的问题
属性 :
1.value 请求中参数名称
2.required 是一个boolean,默认是true
true标识请求中必须包含此参数
false参数可以有也可以没有(必须有时,不传参数会报400错误)
位置:在处理器方法
@RequestMapping(value = "haha.do")
public ModelAndView hahaPara(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "age",required = false) Integer age){
ModelAndView view = new ModelAndView();
view.addObject("msg" , name);
view.addObject("fun", age);
view.setViewName("show");
return view;
}
- 接受对象
处理器方法形参是java对象,这个对象的属性名和请求名一样的。
框架会创建形参java对象,给属性赋值。请求中的参数是name,框架会调用setName()
使用同名原则所以参数中可以有多个对象
并且没法使用RequestParam。
···
@RequestMapping(value = "object.do")
public ModelAndView objectTest(Student student){
ModelAndView mv = new ModelAndView();
mv.addObject("msg", student.getName());
mv.addObject("fun", student.getAge());
mv.setViewName("show");
return mv;
}
····