SpringMVC是一种基于java实现MVC设计模式的请求驱动类型的轻量级Web框架。是Spring FrameWord的后续产品,Spring框架提供了构建Web应用程序的全功能MVC模块,使用Spring可插入MVC架构。从而在使用Spring进行Web开发时,可以选用Spring的SpringMVC框架或者其他MVC开发框架等。
通过IDEA创建SpringMVC工程,创建工程时,选用了骨架,如下图所示
当创建项目完成后,发现项目目录不完整,需要进行补充,添加如下图目录
<%@page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<h2>SpringMVC入门案例</h2><br/>
<a href="hello">入门程序</a><br/>
</body>
</html>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.version>5.2.1.RELEASEspring.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
dependencies>
此处引入jar包,我只引入了spring-webmvc的jar包,但是有的人同时也引入了spring-web这个jar包,其实spring-webmvc依赖于spring-web,这样引入spring-webmvc的jar包会间接的添加了spring-web,而不必显式的去添加spring-web。
<web-app>
<display-name>Archetype Created Web Applicationdisplay-name>
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
<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
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.liang">context:component-scan>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/">property>
<property name="suffix" value=".jsp">property>
bean>
beans>
package com.liang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("HelloController控制器的syaHello方法执行了...");
return "success";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入门程序</title>
</head>
<body>
入门程序执行成功
</body>
</html>
从入门程序执行过程图中可以看出:浏览器发送请求,被DispatcherServlet捕获,该Servlet不处理请求,而是将请求进行转发,转发的路径是根据请求URL匹配@RequestMapping中的内容;匹配成功后,执行对应方法,该方法存在返回值;根据该返回是,借助InternalResourceViewResolver找到对应的结果视图;渲染结果视图,响应到浏览器。
DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户请求,DispatcherServlet的存在降低了组件之间的耦合性。其主要职责是调度工作。
通过HandlerMapping,将请求映射到处理器。
通过HandlerAdapter支持多种类型的处理器。
通过视图解析器解析逻辑视图名到对应的视图。
文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
负责根据用户请求找到对应的Handler,SpringMVC提供了不用的映射器实现不同的映射方式。
开发中编写的棘突业务控制器,由DispatcherServlet把用户请求转发到Handler,由Handler对具体的用户请求做处理。
用于对handler进行执行,通过扩展handlerAdapter可以对更多类型的handler进行处理
负责将处理结果生成View视图,ViewResolver根据逻辑视图名解析成具体的页面地址(物理视图名),再生成View视图对象,最后将View视图进行渲染将处理结果通过页面展示给用户。
此注解用于标记在一个类上,使用此标记的类将成为一个SpringMVC Controller对象。基于注解的控制器不需要在配置文件中部署映射,仅需要使用@RequestMapping注解方法进行请求处理;在SpringMVC的配置文件中,用context:component-scan/启动包扫描功能,以便注册带有@Controller,@Service,@repository,@Component等注解的类成为Spring的Bean。
用于建立请求URL和处理请求方法之间的对应关系。次注解可以标记在类或者方法上,当标记在类上时,表示请求URL的一级访问目录,此处若不写,则相当于应用的根目录,写的话必须以/开头,主要目的是为了使我们的URL可以按照模块化管理;当标记出现在方法上,表示请求URL的第二级访问目录
属性 | 功能 |
---|---|
path | 用于指定请求的URL,和value属性作用一样 |
method | 用于指定请求方式 |
params | 用于指定限制请求参数的条件,支持简单的表达式 |
编写JSP代码
<%@page contentType="text/html; charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>requestMapping的使用</title>
</head>
<body>
<!--第一种访问方式-->
<a href="${pageContext.request.contextPath}/account/findAccount">查询账户</a><br/>
<!--第二种访问方式-->
<a href="account/findAccount">查询账户</a><br/><br/>
<!--请求方式不同-->
<a href="account/saveAccount">保存账户,get请求</a><br/>
<form action="account/saveAccount" method="post">
<input type="submit" value="保存账户,post请求"/>
</form>
<!--params属性示例-->
<a href="account/deleteAccount?accountName=zhangshan&money=100">删除账户,金额100</a><br/>
<a href="account/deleteAccount?accountName=zhangshan&money=1000">删除账户,金额1000</a><br/>
</body>
</html>
编写Controller的代码
package com.liang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller("accountController")
@RequestMapping(path = "/account")
public class AccountController {
/**
* 查询所有账户
* @return
*/
@RequestMapping(path = "/findAccount")
public String findAccount(){
System.out.println("查询了账户...");
return "success";
}
/**
* 保存账户 只接受 post 方式请求
* @return
*/
@RequestMapping(path = "/saveAccount", method = RequestMethod.POST)
public String saveAccount()
{
System.out.println("保存账户");
return "success";
}
/**
* 删除用户 用于测试 params 参数
* @return
*/
@RequestMapping(path = "/deleteAccount", params = {"accountName","money!=100"})
public String deleteAccount()
{
System.out.println("删除用户");
return "success";
}
}
上述代码需要注意的是: 1.保存账户使用get请求的超链接点击后会出现如下页面
这是由于保存账户的方法设置了请求方式,只允许post请求方式。
2.删除用户,金额100的超链接点击后会出现以下页面
这是由于删除账户需要传递满足条件的参数。