学习笔记(02):Spring全家桶(基础篇)-Spring MVC快速开发:第一个例子-Hello World

通过这个最简单的小例子了解Spring MVC的核心流程和控制器:
一、MVC:MVC是三层架构中的一个表现层框架,属于表现层。
  >MVC:将应用分为三部分,Model、View、Controller
    >>>Model:对后台的一些操作进行封装
    >>>Controller:从前端页面接收请求,处理后,去调用后台相关操作,接受后台传回的数据并返回给前端。即实现View层跟Model层的协同。
    >>>View:前端页面,jsp,html等
二、三层架构(3-tier application)
>>>通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。

  1. 表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
  2. 业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
  3. 数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

三、MVC和三层架构的区别:

  1. 三层架构是基于业务逻辑来分的,而MVC是基于页面来分的
  2. 严格说MVC加起来以后才是三层架构中的UI层,也就是说,三层架构中的UI层可以再度分化为MVC,即实体、视图、控制器三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而控制器直接与三层中的BLL进行对话。
  3. 作为UI层的MVC一般不直接操作数据访问层,中间会有一个业务逻辑层封装业务逻辑、调用数据访问层。Controller通过业务逻辑层来得到数据,交给Model进行封装,然后传给相应的View。

四、Spring MVC的工作流程:

  1. 大体流程图:Spring MVC的工作流程
  2. 各组件说明:
    》》 DispatcherServlet(前端控制器):也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。
    》》HandlerMapping(处理器映射器):它根据用户访问的 URL 映射到对应的后端处理器 Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
    》》HandlerAdapter(处理器适配器):它调用后端处理器中的方法,返回逻辑视图 ModelAndView 对象。
    》》Handler(后端处理器):对用户具体请求进行处理,也就是我们编写的 Controller 类。
    》》ViewResolver:视图解析器,将 ModelAndView 逻辑视图解析为具体的视图(如 JSP)。
  3. 工作流程简述:
    用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。——>DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)——>DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller——>HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet——>DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。——>DispatcherServlet将模型数据填充到视图中——>DispatcherServlet将结果响应给用户.

五、例子:

  1. New一个Maven Project
  2. Maven Project不需要自己下载导入jar包,直接通过pom.xml来配置加载。有两种方式添加jar包。第一种是点击下图红圈的位置,可以搜索加载。搜索加载jar
    出问题了明天解决。。。。
    ps:出现的问题是在eclipse中,在进行上边的操作时,不会自动搜索依赖,如下图。在网上进行了一番搜索尝试之后,eclipse成功陷入了崩溃,TMD。不干了,散伙。跪求大佬指点迷津。不会自动搜索依赖
    好,接下来第二种方法:自闭了
    这几天我一直致力于解决上述问题:然后emmmm,记录一下吧。
    +先是:eclipse菜单 window-> show view –> other –> Maven,在打开的窗口里,右键 local repositories –> local repository ,选择 rebuild index,没有效果,
    +之后:eclipse菜单 window –>show view–>other–>Maven–>Maven Respositories点开"Global Respositories",在central上点击右键选择“rebuild index”更新索引,因为需要网络,我看这应该从apache下载maven的库的意思,然后eclipse一直显示进度0.
    +然后又搜了一下,说是要将maven源改为国内阿里云镜像。这个应该是安装了maven,其实我还没太搞清楚?我好像没有安装maven,反正改的方式是maven安装目录下conf配置文件里的settings.xml里换上这段
<mirror>  
  <id>nexus-aliyun</id>  
  <mirrorOf>central</mirrorOf>    
  <name>Nexus aliyun</name>  
  <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror> 

然后我查了一下我好像没有安装maven,但是eclipse里确实集成了maven
+最后我又决定启动eclipse,看看情况,emmm。结果这集竟然成了,emmm
+我查看了一下,我的.m2文件夹下多了一个repository文件夹,里面一堆jar包,应该是eclipse给我下载了下来,但是应该没有下全,因为文件不大,但是不少了。可能是我的电脑良心发现了。。。。。。
不管怎么说问题暂时解决了

续接上文,第二种方法:通过pom.xml源码方式添加:在Maven 中央仓库( http://www.sonatype.org/nexus/或者 http://mvnrepository.com/ 或者http://repo1.maven.org/maven2)搜索需要的jar包,直接复制下边的代码然后粘贴回来。推荐使用第二个仓库。

3.利用add增加所需要的jar包(如下图),之后保存pom.xml.会自动下载,但可能会很慢。add一个jar包
到这里我发现他开始可能只是下了一个索引文件,让你可以搜索add,到你真正add然后保存pom.xml的时候他会开始慢慢的下载。。。,今天乏了,明天我决定先安装个maven从头做,然后再写。

=============================== 这是分割线 =================================================================

Ecliipse里自带的Maven让我心态有些崩,所以我总结了一点解决方法:学习笔记(02-番外):Spring全家桶(基础篇)-Eclipse里自带的maven用起来很恶心怎么办??

=============================== 这是分割线 =================================================================
步骤新笔记: 1. New一个Maven Project,用webapp模板New一个Maven Projec
2. Maven Project不需要自己下载导入jar包,直接通过pom.xml来配置加载。add—>spring-webmvc

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.hello</groupId>
  <artifactId>SpringMVC_HelloWorld</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringMVC_HelloWorld Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-webmvc</artifactId>
    	<version>5.0.11.RELEASE</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>SpringMVC_HelloWorld</finalName>
  </build>
</project>
  1. 配置 web.xml:
    技 巧:需要配置dispatcherservlet,所以输入dispa之后利用‘alt+/’可以快速补全代码,而不必一行行的写。
<!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>
  <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<!-- 这里定义的是一个叫springDispatcherServlet-servlet.xml的配置文件的文件名,具体配置会转到这个文件 -->
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- <init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>location</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup> -->
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern><!--配置servlet适用于那些网页  ; /表示适用于网站所有的网页 -->
	</servlet-mapping>
</web-app>
  1. 创建一个/SpringMVC_HelloWorld/src/main/webapp/WEB-INF/springDispatcherServlet-servlet.xml。因为在web.xml里配置的关系,文件名已经固定了。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 本文件的名字格式和位置是由web.xml来决定的,系统在调用web.xml时会同时调用该文件 
这个文件的作用是配置与他同名的servlet的一些内容-->
<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/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
	<!-- 配置扫描的包 -->
	<context:component-scan base-package="com.hello"></context:component-scan>
	
	<!-- 配置视图解析器 -->	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置页面位置在 /WEB-INF/pages中-->
		<property name="prefix" value="/WEB-INF/pages/"></property>
		<!-- 配置所有的页面都是以jsp结尾的 -->
		<property name="suffix" value=".jsp"></property>
	</bean>	
</beans>
  1. 后台代码会写在/SpringMVC_HelloWorld/src/main/java/com/hello/HelloWorldController.java。因为springDispatcherServlet-servlet.xml中配置的扫描com.hello包
package com.hello;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("h")//定义它的url
public class HelloWorldController {
	//这是一个静态页面
	//返回一个静态页面
	@RequestMapping("hello")//定义访问它的url
	public String helloWorld() {
		return "hello1";//通过配置文件转到这个名字的文件
	}
	//动态:从后台取数据。。。有两种方式
	//Model方式,返回一个页面
	@RequestMapping("hello2")//定义访问它的url
	public String hello(Model model) {
		String str = "Welcome!--This is hello2.jsp";
		model.addAttribute("message",str);
		return "hello2";//通过配置文件转到这个名字的文件
	}
	//返回一个ModleAndView类型
	@RequestMapping("hello3")//定义访问它的url
	public ModelAndView helloW() {
		ModelAndView modelAndView = new ModelAndView();
		String str = "Welcome!--This is hello3.jsp";
		modelAndView.addObject("message",str);
		modelAndView.setViewName("hello3");//通过配置文件转到这个名字的文件
		return modelAndView;
	}
}
  1. 根据HelloWorldController.java里的配置写几个页面,因为springDispatcherServlet-servlet.xml的关系要新建/WEB-INF/pages/并且这几个页面是jsp的。代码略
  2. 根据HelloWorldController.java定义的url访问页面,比如http://localhost:8080/SpringMVC_HelloWorld/h/hello3,会跳转到/h/hello3
    而http://localhost:8080/SpringMVC_HelloWorld/h/hello会来到/h/hello
  3. 整体的项目主要结构主要项目结构
  4. 例子代码:点击下载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值