SpringMVC框架作用

解决了V-C的交互问题,即视图与控制器的交互问题。

优点:

1.SpringMVC框架提供了一整套完善的组件。
2.SpringMVC是以强大的Spring容器为基础的框架。
3.框架的配置简单又不失灵活性。
4.代码的可重用性很高。
5.可扩展性好。

SpringMVC核心组件

1.DispatcherServlet

前端控制器,主要职责是接收所有请求(根据配置文件来决定),并将请求转发给对应的控制器,接收控制器的处理结果,确定最终由哪个视图完成响应!

2.HandlerMapping

处理请求路径与控制器的映射关系。

3.Controller

实际处理请求的组件,例如接收请求参数,决定最终是转发或重定向的方式来响应。

4.ModelAndView

控制器的处理结果,其中的Model表示转发的数据(如果是重定向,则Model没有意义),而View表示最终负责响应的视图组件的名称。

5.ViewResolver

根据视图组件的名称,确定具体使用的是哪个视图组件。

SpringMVC-HelloWorld

1.创建项目

创建Maven Project,勾选Create a simple project,然后,Group Id值为cn.edu.spring(根据自己实际需要来决定),Artifact Id值为SPRINGMVC-01-HELLOWORLD(这个名称根据自己的实际来写),Packaging选择war

接下来,需要执行4个步骤(以后每次创建项目时都需要做的事情):

1)生成web.xml文件;
2)添加依赖:在此前的项目中找到pom.xml,将其中的依赖的代码复制到当前项目中,关于依赖的jar包,会越用越多,学习时,只加不减;
3)复制spring.xml文件到当前项目中,并删除其中的配置,除非你确定这些配置是当前项目中必须使用的;
4)为项目添加Tomcat运行环境;

2.配置DispatcherServlet

由于需要DispatcherServlet接收所有请求,所以,首先必须在web.xml配置它:

<!-- 配置DispatcherServlet -->
<servlet>    <servlet-name>SpringMVC</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping>  <servlet-name>SpringMVC</servlet-name>   <url-pattern>*.com</url-pattern> </servlet-mapping>

经过以上配置,则任何以.com作为后缀的请求,都将由DispatcherServlet来处理!

由于项目是基于Spring的,希望项目启动时就加载Spring的配置文件,并使得DispatcherServlet已经完成初始化可以随时接收请求,所以,还需进一步的配置:

<!-- 配置DispatcherServlet -->
<servlet>    <servlet-name>SpringMVC</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <!-- 配置spring的配置文件 -->    <init-param>        <param-name>contextConfigLocation</param-name>备注:这个name是源码中的,固定                <param-value>classpath:spring.xml</param-value>备注:值要看个人的配置文件的路径    </init-param>    <!-- 启动Tomcat时即初始化该Servlet -->    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>    <servlet-name>SpringMVC</servlet-name>    <url-pattern>*.com</url-pattern>
</servlet-mapping>

至此,当项目启动时,就会初始化DispatcherServlet,并且,在初始化过程中,会加载Spring的配置文件。

测试

如果Spring能正常工作,则配置是成功的!
在src\main\java中创建一个测试类cn.edu.spring.test.Test,并且,显式的添加构造方法,并输出内容:


```java
@Component public class Test {public Test() {System.out.println("已经加载Spring配置文件!");    }
}

然后,在Spring的配置文件中添加组件扫描:
<context:component-scan base-package="cn.edu.spring" />

最终,把项目部署到Tomcat,并启动Tomcat,在启动日志中如果能够看到以上输出语句,则成功!

3.设计目标

发出请求http://localhost:8080/项目名称/hello.com,要求在界面中显示HelloWorld字样。

4.处理请求

以上完成了流程中的第1步,接下来,如果发出hello.do请求,就会被DispatcherServlet接收得到,然后,DispatcherServlet应该根据hello.do请求路径去询问HandlerMapping得知由哪个控制器去处理请求,原始的实现方式是使用SimpleUrlHandlerMapping类去进行配置,不过,这种配置方式非常麻烦,而且,对应关系不明确(所有的路径与控制器的配置都在同一个配置文件中,导致不便于管理),所以,后续都是使用注解完成相关配置,则在开发过程中,跳过第2步和第3步(只是开发时不用关注,框架的执行流程不变)。

为了确保有控制器处理请求,所以,创建HelloController:

所有的控制器都应该是由Spring管理的,所以,需要为控制器类添加@Controller注解:

@Controllerpublic class HelloController {}

然后,在类中自定义处理请求的方法,方法的访问权限是public的,返回值暂时使用String,方法的名称可以自由定义,方法的参数暂时留空:

public String showHello() {
}

在SpringMVC中,请求对应的可以是某个方法,而不一定每个请求对应一个控制器类,如果请求对应的是以上方法,则需要在方法的声明之前添加@RequestMapping("/hello.com"):

@RequestMapping("/hello.com")
public String showHello() {}

完成以上步骤后,即表示:路径为/hello.com的请求将触发showHello()方法被执行!

测试

在以上方法中输出任意语句,然后,启动项目,请求对应的路径,观察控制台输出:

@RequestMapping("/hello.com")
public String showHello() {System.out.println("HelloController.showHello()");return null;
}

实际运行效果是:页面会显示错误:
控制台可以看到输出语句:

5.显示页面

至此,执行流程已经完成前4步,接下来,控制器应该向DispatcherServlet返回结果:

@RequestMapping("/hello.com")
public String showHello() {// 测试    System.out.println("HelloController.showHello()");// 返回视图组件的名称return "helloworld";
}

以上返回的字符串表示最终负责显示的视图组件的名称,但是,并不表示是哪个文件!
接下来,需要配置ViewResolver,使得DispatcherServlet通过它可以知道刚才控制器返回的"helloworld"到底是哪个页面!
实际使用的ViewResolver是InternalResourceViewResolver,需要在spring.xml进行配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>

InternalResourceViewResolver的工作方式是以项目的根路径为参考(在开发时,对应的是webapp文件夹),使用前缀+视图组件名+后缀得到视图文件的位置,例如实际存在的jsp文件是webapp/WEB-INF/helloworld.jsp,由于它本身使用webapp作为根级,所以,前缀是/WEB-INF/,后缀是.jsp,结合控制器返回的"helloworld"进行拼接,就可以得到以上路径,从而确定视图组件的位置,例如配置为:

<!-- 配置视图解析器ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <!-- 配置前缀 -->    <property name="prefix" value="/WEB-INF/" />    <!-- 配置后缀 -->    <property name="suffix" value=".jsp" />    <!-- 经过以上配置后, -->    <!-- 当前项目中的jsp文件都应该放在/WEB-INF/下 -->
</bean>

基于视图解析器的前缀是/WEB-INF/,后缀是.jsp,结合控制器返回的"helloworld"字符串,则需要在WEB-INF文件夹下创建名为helloworld.jsp的文件完成最终的显示:

通过浏览器再次访问,实际效果应该是:

创建简单demo通用步骤相关推荐

  1. c语言 threads.h 创建简单的通用多线程模块实例

    对多线程编程的需求不多,因而在这方面的实例和教程很少.对于编程大牛来说,这也不是一个很深奥的实例.这里做一个简单实用的实例,它使用了 C11 标准头 threads.h ,适用于新的多线程标准. th ...

  2. win32汇编创建线程简单Demo

    代码如下:thread.asm: .386.model flat,stdcalloption casemap:noneinclude windows.inc include user32.inc in ...

  3. Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

    来源:https://www.cnblogs.com/7tiny/p/10493805.html [前言] Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请 ...

  4. 服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

    服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置) 原文:服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置) [前言] ...

  5. java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)

    转载自 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一) 最近在找java的小项目自己写着玩,但是找不到合适的,于是写开始学一点爬虫,自己也是感觉爬虫比较有趣.这里自己找了一个 ...

  6. jquery前端简单分页_如何使用jQuery创建简单的分页

    jquery前端简单分页 How to create easy pagination with jQuery jQuery pagination. All we know, that when we ...

  7. excel箱形图中位数_在Excel中创建简单的箱形图

    excel箱形图中位数 A box plot (box and whisker chart) lets you show how numbers are distributed in a set of ...

  8. 研究HDK(Houdini Development Kit):概括配置一个HDK工程的通用步骤

    "无用"的前言 在<初步了解 make 的基础并尝试使用>和<研究HDK(Houdini Development Kit):使用CMake自动生成VS工程> ...

  9. 【Flask框架】一. Flask框架初体验(配置环境 + 简单demo样例)

    文章目录 一. Flask框架初体验(配置环境 + 简单demo样例) 虚拟环境 新建项目 将Pycharm改为FLASK_DEBUG模式 修改FLASK_DEBUG模式的步骤 配置文件 简单用法 U ...

最新文章

  1. Python如何优化列表接口进行分页
  2. 2.2. Array
  3. Flask web开发之路二
  4. mysql读书笔记----时间函数
  5. 【数据挖掘导论】——数据质量
  6. 【OO学习】OO第二单元作业总结
  7. iPhone 12 mini被质疑锁屏触摸不灵
  8. [论文阅读] Exploring Dense Context for Salient Object Detection
  9. MAC硬盘空间减少的隐藏杀手,VM到底是什么?
  10. 计算机无法访问权限,局域网共享无法访问权限不足的解决方法
  11. 电影下载、播放、制作、转换、各类问题全攻略
  12. 身份认证 对称密钥的认证协议 公开密钥的认证协议 公钥基础设施PKI
  13. java将小写的日期转换为大写的日期
  14. 普通学历,大一大二要不要打ACM?
  15. 关于mysql的题目_关于MySQL的经典例题50道 答案参考
  16. Elasticsearch的路由(Routing)特性
  17. Tushare不止数字!新文字特色数据 ---(4)
  18. 想看微信读书终生无限卡,瞅这儿
  19. nvme-cli常用指令
  20. 去哪儿网2019秋招笔试题

热门文章

  1. 阿里P7架构师年薪50W,只因做到了这几点
  2. 有一种胸襟,叫“我搭台 你唱戏” 有一种气魄,叫“我做平台 大家赚钱”
  3. k8s中文件描述符与线程限制
  4. paypal里的钱怎么取出来?
  5. Linux下的画图软件
  6. catia二次开发_侧长条花纹定义
  7. 卫星商业价值的尽头,谁来善后?
  8. 【数据结构】树的逻辑结构
  9. 任正非回应华为偷窃美国技术:美国都没做出来 我去哪里偷?
  10. 美团外卖uml流程图_基于UML的外卖订餐系统需求分析