idea创建基于maven的springMVC简单项目
springMVC执行流程
- 客户端发送请求到核心控制器(DispatchSerlet),核心控制器获得请求后,根据请求得url在处理器映射器(handlerMapping)中查找对应的handler对象。
- 处理器映射器将找到的handler对象返回给核心控制器
- 核心控制器派遣处理器适配器(HandlerAdapter)执行Handler
- 处理器适配器将请求转给Handler对象执行具体业务
- 处理器对象Handler,调用Model层(一般指dao,entity等)进行业务处理,最后将结果返回给处理器适配器,返回结果为ModelAndView对象
- 处理器适配器将ModelAndView对象返回给核心控制器
- 核心控制器调用视图解析器将对象View进行解析,视图解析器根据核心控制器发送来的逻辑视图解析为一个物理视图并将物理视图返回给核心控制器
- 核心控制器调用视图渲染器将试图渲染(将model数据加载到特定的对象如request)
- 核心控制器向客户端响应结果
idea创建简单的springMVC
- idea创建maven Web项目
- 之后点next,会出现groupId和ArtifactId,规范来讲,其中groupId一般分为两段,第一段表示域名,第二段表示公司名,ArtifactId表示项目的名称,若是作为练习使用,可以随意起,之后一直点击next,next,Finish就可以了
注意:创建Maven项目的时候也许会报错,其可能是maven的配置环境问题,也可能是idea不支持maven3.6.2的缘故,如果是后者可降低版本,其余这里不做说明 - 完成之后会有如下显示,点击Enable Auto-Import,这样是为了以后的依赖jar包时自动导入。
- 同时在src目录下创建java和resource目录,并将java设为Sources Root,将resources设为Resources Root,目的是为了将所有资源放置在resources包中,java代码放置在java包中。
- 配置web.xml
在src/main/webapp/WEB-INF目录下打开web.xml,如下图,由于maven生成的web.xml是2.3版本,改为3.0版本,因为以前版本有些功能不支持使用(如jstl)
version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
将以上代码复制到如下图所示的位置,就OK了!
- 配置Tomcat,打开右上角的Add Configurations,点击+号,选择Local就OK了
- 此时这会有警号,这是因为还没有把此项目添加进去,如果以前没有配置过Tomcat,需要点击Configure配置你本地Tomcat的路径,然后做接下来的操作,如果配置过,则直接点击Deployment,点击+号,选择Artifacts,选择第二个,然后点击OK,然后Apply,最后关闭,这样Tomcat就配置好了。
- 配置pom.xml,打开pom.xml在dependencies标签中添加web项目需要的servlet和spring项目需要的spring的jar包依赖,以及spring MVC 的依赖包,以及一会使用的EL表达式jstl的依赖包
- 示例代码如下:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
也可以在mvnrepository中下载依赖包(https://mvnrepository.com/)
search框中输入servlet或者jstl或者spring或者spring MVC(要把该包有关的依赖包都下载到,如web)可下载相应的依赖包。
- 然后选中项目,点击Add Framework Support 添加spring MVC 框架,如果列表中没有spring 项目的话,可能是该项目已经添加了spring项目,可点击file-> Project Structure->Facets,删除spring,然后Apply之后重新操作。
- 当操作成功后,再次打开web.xml,会发现idea自动配置了核心控制器,然后将url-pattern标签中的值改为 / ,如下图:
- 然后配置spring.xml,在resource中创建一个文件,名字叫spring-config.xml,是用来配置spring的,配置代码如下所示:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
这是基于注解的配置,点击这里,可以从这里找到这段代码,
由于这是基于springMVC项目,需要添加MVC的配置,可将一下红框中的单词替换为mvc就可以了,代码如下:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>
- spring-config.xml虽然配置好了,但是并没有通知web.xml,需要在web.xml中的servlet初始化操作,如图:
- 然后在java包中建立User.java,一个简单的javaBean对象,代码如下:
public class User {
private String name;
private String password;
public User(){}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 创建UserController.java,该类为处理器类,主要是处理业务功能,并将结果封装到ModelAndView对象中去,然后返回给处理器适配器。
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* 处理器对象,需要实现org.springframework.web.servlet.mvc.Controller接口,
* 功能是:简单的创建三个User对象,存入list集合中,在showUser.jsp中显示
*/
public class UserController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//创建3个对象
User user1 = new User("张三","123");
User user2 = new User("李四","456");
User user3 = new User("王五","789");
//封装到list集合中去
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
//将集合封装到ModelAndView对象中去,返回给处理器适配器
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("users",users );
modelAndView.setViewName("showUser.jsp");
return modelAndView;
}
}
- 然后在webapp目录下创建相应的showUser.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table align="center" border="1">
<tr>
<th>姓名</th>
<th>密码</th>
</tr>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.name}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
- spring项目中,需要将对象交由spring管理,所以需要在spring-config.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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
id属性和name属性用法差不多,但是id属性是唯一的,但是name属性不唯一
这里访问路径即为name属性值,但是属性里面必须加 /
-->
<bean name="/user" class="UserController"/>
</beans>
这样子简单的一个功能就实现了,当访问http://localhost:8080/user是,核心控制器(DispatchServlet)将会把url通知到默认的处理器映射器(HandlerMapping)中,HandlerMapping收到并返回给handle对象给DispatchServlet,DispatchServlet又将委派默认适配器(HandlerAdapter),HandlerAdapter将请求转给UserController类,执行创建3个User对象,并将其封装成list集合,又将list集合封装成ModelAndView对象,并设置返回页面,此时的页面知识页面名字而已,即逻辑名字,然后返回给HandlerAdapter,HandlerAdapter又返回给DispatchServlet,DispatchServlet又请求视图解析器和视图渲染器对将该页面名字找到对应的页面,并修饰美化页面,最后DispatchServlet响应给客户。
效果如下:
此过程中,如果不想使用默认的HandMapping,需要在spring-config.xml中通过类org.springframework.web.servlet.handler.SimpleUrlHandlerMapping.java进行配置,代码如下:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
id属性和name属性用法差不多,但是id属性是唯一的,但是name属性不唯一
这里访问路径即为name属性值,但是属性里面必须加 /
-->
<bean id="userController" name="/user" class="UserController"/>
<!--
配置指定的url的Mapping地址
-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<!--
设置url与控制器之间的映射关系
key值表示标签体为controller的url路径,标签体为controller的id
-->
<props>
<prop key="users">userController</prop>
</props>
</property>
</bean>
</beans>
END