SpringMVC学习笔记(二)创建一个SpringMVC项目
如果你创建出来的项目没有src目录,那么请按下面操作,再重新创建
在VM Options加上 -DarchetypeCatalog=internal
项目需求
用户在页面发起一个请求,请求交给springmvc的控制器对象,并显示请求的处理结果(在结果页面显示一个欢迎语句)。
实现步骤:
1.新建web maven 工程
2.加入依赖 spring-webmvc依赖(做web开发必须加的依赖),因为springmvc是基于spring的,所以
会间接把spring的依赖都加入到项目
jsp,servlet依赖
3.重点:在web . xml中注册springmvc框架的核心对象DispatcherServlet(只要是springmvc项目,就必须有DispatcherServlet,这是衡量有没有用到springmvc的标准)
1 )DispatcherServlet叫做*调度器,是一个servlet,它的父类是继承HttpServlet
2)DispatcherServlet也叫做前端控制器( front controller )
3 )DispatcherServlet负责接收用户提交的请求,调用其它的控制器对象,并把请求的处理结果显示给用户
4.创建一个发起请求的页面index. jsp
5.创建控制器(处理器)类
1 )在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中
2 )在类中的方法上面加入@RequestMapping注解。
6.创建一个作为结果的jsp,显示请求的处理结果。
7.创建springmvc的配置文件( spring的配置文件一样)
1 )声明组件扫描器,
指定@Contorller注解所在的包名
2)声明视图解析器。帮助处理视图的。
在pom.xml加入依赖
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
点击右侧maven可以查看依赖
在pom.xml的plugins下面添加插件,可加可不加
<!-- 编码和编译和JDK版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
接下来我们看看web.xml,看到2.3了吗,我们需要一个更高的版本,所以需要把这个webxml删了重新建web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
删掉之后再添加
这就4.0了,再看看web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
还是2.3,所以删掉重新建,我们改个名字
现在看看呢,4.0了
<?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">
</web-app>
然后我们把1web.xml改成web.xml 快捷键shift+f6
或者右键Refactor
创建springMVC*调度器(DispatcherServlet)
在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核心对象DispatcherServlet-->
<servlet>
<!-- springmvc这个名字是随便取的,是*调度器的名字 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet是一个servlet,按照servlet规范 ,首次访问对象时再创建对象,现在只是声明,对象还不会被创建 ,因为还没有访问servlet -->
<!--因为servlet有一个作用是创建springmvc容器对象的,所以我们期望是tomcat服务器启动就把servlet对象创建出来-->
<!--需要在tomcat服务器启动后,创建Di spatcherServlet对象的实例。为什么要创建Di spatcherServlet对象的实例呢?
因为DispatcherServlet在他的创建过程中,会同时创建springmvc容器对象读取springmvc的配置文件, 把这个配置文件中的对象都创建好,当用户发起
请求时就可以直接使用对象了。-->
<!--servlet的初始化会执行init ( )方法。DispatcherServlet在init ( ) 中{
//创建容器,读取配置文件WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc . xml");
//把容器对象放入到ServletContext中getServletContext( ) .setAttribute(key, ctx);
}-->
<!--下面一句实现在tomcat启动后,创建Servlet对象,load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,数值越小 ,
tomcat创建对象的时间越早。大于等于0的整数。-->
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
此时配置tomcat
配置过程可以参考我的文章https://blog.csdn.net/ningmengshuxiawo/article/details/107565397
运行,发现报错
caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/myweb-servlet.xml]
这是因为springmvc创建容器对象时,读取的配置文件默认是/WEB- INF / - servlet . xml
那么我们需要在WEB- INF目录下面去创建这样一个xml文件,但是这样也未免太过拘束
于是我们可以通过配置来自定义springMVC读取的配置文件的位置
<!-- 自定义springMVC读取的配置文件的位置-->
<init-param>
<!-- sprsingmvc的配置文件的位置的属性-->
<param-name>contextConfigLocation</param-name>
<!-- 指定自定义文件的位置,我们制定在类路径,所以需要在类路径的resources目录下创建springmvc,xml-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
设置servlet-mapping
<servlet-mapping>
<!-- 此处的myweb与上面的myweb对应-->
<servlet-name>myweb</servlet-name>
<!--使用框架的时候,url- pattern可以使用两种值
1. 使用扩展名方式,语法*.xXxx , xxx是自定义的扩展名。 常用的方式*.do, *.action, * .mvc等等
意思是如果我们的请求是以.do, .action, .mvc结尾的,就交给myweb这个servlet处理
例如 :请求地址http:/ / localhost : 8080/ myweb/ some.do
http:/ / localhost : 8080/ myweb/ other.do
我们下面url-pattern是*.do,所以.do请求交给myweb这个*调度器处理
2.使用斜杠 “/”-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
注意:servlet的配置是固定的,上述配置可以直接拷贝到其他工程使用
创建请求页面
默认创建的jsp没有指定的编码方式,我们把它删掉重新创建一个jsp页面
创建控制类
创建控制器方法
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//@Controller这个注解是创建处理器对象的,对象放在springmvc容器中
//@Controller放在类的上面,与spring中的@Service,@Component一样,都是创建对象的,表示这是一个控制器对象,能够处理请求
//能处理请求的都是控制器(处理器): MyController能处理请求,叫做后端控制器(back controller)
@Controller
public class MyController {
/*
处理用户提交的请求,springmvc中是使用方法来处理的。
方法是自定义的, 可以有多种返回值, 多种参数,方法名称自定义
*/
/**
* 准备使用doSome方法处理some.do请求。@RequestMapping:这个注解告诉框架我这个方法要处理用户请求
* @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。
* 一个请求指定一个方法处理。
* 属性: 1. value 是一个String,表示请求的url地址的(some.do)。
* value的值必须是唯一的, 不能重复。 在使用时,推荐地址以“/”为开头
* 使用位置:1.在方法的上面,这是最常用的。
* 2.在类的上面
* 说明: 使用RequestMapping修饰的方法叫做处理器方法或者控制器方法。
* 使用@RequestMapping修饰的方法可以处理请求的,类似Servlet中的doGet, doPost
*
* 返回值:ModelAndView 表示本次请求的处理结果,包含两部分,Model和View
* Model: 数据,请求处理完成后,要显示给用户的数据
* View: 视图, 比如jsp等等。
*/
@RequestMapping(value="/some.do")//some.do"是请求地址,和index.jsp中的值一样,加个斜杠表示是根地址
//这个注解就表示如果请求是some.do,那么这个请求都由doSome()方法来处理
public ModelAndView doSome(){// doGet()--service请求处理
//处理some.do的请求,相当于service调用处理完成了。
//ModelAndView是框架中的类
//创建返回值
ModelAndView mv=new ModelAndView();
//添加数据 框架在请求的最后把数据放入到request作用域。相当于执行request.setAttribute("msg","欢迎使用springmvc做web开发");
mv.addObject("msg","欢迎使用springmvc做web开发");
mv.addObject("fun","执行的是doSome方法");
//指定视图 指定视图的完整路径
//框架对视图执行的forward操作, request.getRequestDispather("/show.jsp).forward(...)
mv.setViewName("/show.jsp");
// mv.setViewName("/WEB-INF/view/show.jsp");
// mv.setViewName("/WEB-INF/view/other.jsp");
return mv;//数据和视图放到mv了,Mv后期会做setAttribute,forward处理
//some.do请求执行之后,会调用show.jsp显示结果
}
}
接下来在webapp下创建show.jsp,在show.jsp写以下内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>show.jsp从request作用域获取数据</h3><br/>
<h3>msg数据:${msg}</h3><br/>
<h3>fun数据:${fun}</h3><br/>
<%--${msg}是正则表达式,从mv中获取key为msg的数据值--%>
</body>
</html>
声明组件扫描器
控制器类是一个类,要用注解的话,必须要有组件扫描器,所以需要在springmvc.xml中声明组件扫描器
<!--声明组件扫描器-->
<context:component-scan base-package="com.bjpowernode.controller"/>
这样注解修饰的类就能够创建对象了,就能处理请求了
运行
运行之后,我们在浏览器中访问http://localhost:8080/ch02_HellospringMVC_war/
点击some.do链接,跳转到show.jsp页面
总结
与写servlet没有太大的区别,框架做简单工作时会比较麻烦,框架适合中型大型项目,项目越小用框架反而越麻烦,框架在大项目中体现优势,因为很多重复的工作框架都做好了
附件
源码地址
提取码:vy3z
本文地址:https://blog.csdn.net/ningmengshuxiawo/article/details/107578538
推荐阅读
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
SpringMVC学习笔记(二)创建一个SpringMVC项目
-
SpringMVC学习笔记二
-
SpringMVC 学习笔记二
-
SpringMvc基础(二):快速搭建一个Maven项目的SpringMvc
-
创建第一个core项目(netCore学习笔记1)
-
【SpringMvc学习笔记(二)】入门案例Demo以及RequestMapping详解
-
SpringMVC 学习笔记(二) @RequestMapping、@PathVariable等注解
-
SpringBoot学习笔记【二】-[SpringMvc+SpringTask+JPA集成开发]
-
SpringBoot学习笔记【二】-[SpringMvc+SpringTask+JPA集成开发]