SpringMVC的简介
SpringMVC是做web开发的框架,实际上是spring框架的一个模块,基于spring框架的容器的概念和IOC(控制反转)的概念,SpringMVC会创建SpringMVC容器WebapplicationContext,对控制器对象进行管理,控制器对象的创建使用@Controller进行创建。
SpringMVC是一个MVC框架,M指的是model,模型,一般是对象,用于储存数据,对应javaweb项目里面的pojo对象。V指的是view,示图,用于接受数据,并反馈给用户,对应javaweb项目里面的jsp。C指的是controller,控制器,指的是controller对象,用于处理客户的请求,控制器有两个,前端和后端,前端控制器也被称为DispatcherServlet(中央控制器),用于将用户的请求进行分类,发给对应的后端控制器进行处理,后端控制器收到中央控制器发来的请求,处理完后,再返回给中央控制器。
一般的,Web项目分为三层,web层,service层和dao层。SpringMVC便是web层的框架,主要负责接受用户请求,显示处理结果的。
SpringMVC配置的流程
- 在web.xml文件中配置DispatcherServlet(中央控制器)
<?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的核心对象DispatcherServlet
需要在tomcat服务器启动后,创建DispatcherServlet对象实例
为什么要创建DispatcherServlet对象的实例呢?
因为在DispatcherServlet创建过程中,会同时创建springmvc容器对象,
读取springmvc的配置文件,把这个配置文件中的对象都配置好,
当用户发起请求时就可以直接使用对象了。
servlet的初始化会执行init()方法,DispatcherServlet在init()中{
//创建容器,读取配置文件
webApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);
}
-->
<servlet>
<servlet-name>springmvc</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对象
数字表示启动后创建对象的顺序,数值越小,tomcat创建对象越早,要求大于等于0的整数
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
使用框架的时候,url-pattern可以使用两种值
1.使用扩展名方式,语法 *.xxxx , xxxx时自定义扩展名。常用的方式 *.do, *.action, *.mvc等等
http://localhost:8080/myweb/some.do
http://localhost:8080/myweb/other.do
2.使用斜杠"/"
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--这里配置的是过滤器,解决post请求中文乱码的问题-->
<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>
</web-app>
- 在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.controller"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 创建Controller控制器,需要使用@Controller和@RequestMapping注解
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/*
* @Controller:创建处理器对象,对象放在springmvc容器中
*
* 能处理请求的都是控制器(处理器):MyController能处理请求,
* 叫做后端控制器(back controller)
* */
@Controller
public class MyController {
@RequestMapping(value = "/receiveproperty.do")
public ModelAndView doSome(String name, Integer age){
//这里的name和age参数,需要和前端表格提交的参数名称相同
//处理some.do请求,相当于service调用处理完成了
ModelAndView mv = new ModelAndView();
//添加数据,框架在请求的最后把数据放入到request作用域
//request.setAttribute("msg","欢迎使用....");
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("show");
return mv;
}
}
- 前端的页面如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>第一个springmvc项目</p>
<form action="receiveproperty.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交参数">
</form>
</body>
</html>
- 示图show.jsp页面如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>/WEB-INF/view/show.jsp从request作用域获取数据</h3><br/>
<h3>myname数据:${myname}</h3>
<h3>myage数据:${myage}</h3>
</body>
</html>