springMVC 学习笔记(一):spring 入门

什么是 springMVC

springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。springMVC 是一个基于 mvc 的 web 框架。

在 spring 中如下图所示:

springMVC 组件及工作流程

组件

springMVC 的主要组件大致有以下这些:

  • 前端控制器 DispatcherServlet: 接收请求,响应结果,相当于转发器。该组件能减少其他组件之间的耦合度。
  • 处理器映射器 HandlerMapping:根据请求的 url 查找 Handler。
  • 处理器适配器 HandlerAdapter: 按照特定规则去执行 Handler。
  • 处理器 Handler:指定要执行的程序。
  • 视图解析器 View resolver:进行视图解析,根据视图名解析成真正的视图。
  • 视图 View:View 是一个接口,实现类支持不同的 View 类型。
工作流程图

工作流程

1 发起请求到前端控制器 DispatcherServlet;

2 前端控制器请求 HandlerMapping 查找 Handler ,可以根据 xml 配置,注解进行查找;

3 处理器映射器 HandlerMapping 向前端控制器返回 Handler;

4 前端控制器调用处理器适配器去执行 Handler;

5 处理器适配器去执行 Handler;

6 Handler 执行完成给适配器返回 ModelAndView,其中 ModelAndView 是 springMVC 框架的一个底层对象,包括 Model 和 view;

7 处理器适配器向前端控制器返回 ModelAndView;

8 前端控制器去请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp);

9 视图解析器向前端控制器返回 View;

10 前端控制器进行视图渲染,视图渲染将模型数据(在 ModelAndView对象中)填充到 request 域;

11 前端控制器向用户响应结果。

简单来说,就是遵循 MVC软件架构模式。

入门程序

举个栗子,编写个程序来实现 springMVC 的功能。

在这里我们还是在 IntellJ IDEA 中使用 maven 来快速搭建开发环境。

打开 idea,创建新项目,选择 maven,勾选 create from archetype,选中 webapp选框。

一路选择后, maven便帮我们自动生成了一个简单的 web 文件夹,但这个并不是 maven 标准结构,我们选择 File -> Project Structure -> Modules,修改文件结构如下:

修改 pom.xml,添加 springMVC 及相关的依赖:

  <dependencies>

    <!-- springmvc 框架 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency> <!-- jsp操作 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> <!-- servlet支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency> <!-- standard包 -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency> </dependencies>

配置前端控制器,修改 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_3_1.xsd"
version="3.1"> <!-- springmvc 前端控制器 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation 配置 springMVC 加载的配置文件(配置处理器映射器,适配器等等)
若不配置,默认加载 WEB-INF/servlet 名称-servlet(springmvc-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/springmvc-servlet.xml</param-value>
</init-param>
</servlet> <!-- 拦截请求 -->
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>

创建映射文件 springmvc-servlet.xml , 配置 Handler, 处理器映射器,处理器适配器,视图解析器等:

<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置Handler -->
<bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController"/> <!-- 处理器映射器 将 bean 的 name 作为 url 进行查找,需要在配置 Handler 时指定 beanname(就是 url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 处理器适配器 所有处理器适配器都实现了HandlerAdapter 接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 视图解析器 解析 jsp 解析,默认使用 jstl 标签,classpath 下要有jstl 的包 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>

然后创建 pojo 类 Items.java 和 controller 类 ItemsController.java,这里我们没有连接数据库,作为演示,直接在 pojo 类中填充静态数据即可:

Items.java

package cn.itcast.ssm.po;

import java.util.Date;

public class Items {
private Integer id; private String name; private Float price; private String pic; private Date createtime; private String detail; //getter 和 setter 方法...
}

ItemsController.java

package cn.itcast.ssm.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import cn.itcast.ssm.po.Items;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller; import java.util.ArrayList;
import java.util.List; // 实现 controller 接口的处理器
public class ItemsController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//调用 service 查找数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>(); //向 list中填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T439 联想笔记本电脑!"); Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!"); itemsList.add(items_1);
itemsList.add(items_2); //返回 ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当与 request 的 setAttribute 方法, 在 jsp 页面中通过 itemsList 取数据
modelAndView.addObject("itemsList" ,itemsList); //指定视图
modelAndView.setViewName("WEB-INF/jsp/items/itemsList.jsp"); return modelAndView;
}
}

创建 jsp 文件,设计页面布局:

itemsList.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td> <td><a href="${pageContext.request.contextPath }/item/editItem.action?id=${item.id}">修改</a></td> </tr>
</c:forEach> </table>
</form>
</body> </html>

文件目录结构如下图所示:

我们的代码到这里便写完了,接下来我们来配置 Tomcat,部署Tomcat 发布我们的网页。

点击 Run -> Edit Configurations , 打开控制面板后,点击右上角的 + ,添加 Tomcat。

添加好 Tomcat 后,点击 Configure,添加下载解压好的 Tomcat 文件。

然后点击控制面板的 Deployment 选项,添加后缀为exploded 的 Artifact 文件,并按下图所示,设置 On 'update' action 和 On frame deactivation 为 Update classes and resources 热部署方式,这样修改代码后,就不需要重新启动 Tomcat 便能加载修改后的页面。

然后我们启动 Tomcat,打开浏览器,输入相应的网址,便能看到我们的 springMVC 程序了。

至此,一个完整的 springMVC 程序便被我们实现出来了。

springMVC 的坑

最后再讲一下我编写这个入门程序遇到的坑(捂脸)。

1 最好使用 Tomcat8.0以上版本,如果使用7.0版本,javax.servlet-api 需要3.0版本及以下,同时还需修改 web.xml 中的声明:

web-app version="3.1" 改为 web-app version="3.0"

web-app_3_1.xsd 改为 web-app_3_0.xsd

2 使用的 jstl 的 jar 包,如果使用 maven 导入,注意使用:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

这个源,别使用 javax.servlet.jsp.jstl 中的,不然会报以下错误:

java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag

springMVC 学习笔记(一):springMVC 入门的更多相关文章

  1. springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

    springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...

  2. springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定

    springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定 标签: springmvc springmvc学习笔记12-springmvc注解开发之包装类型參数绑定 需求 实现方 ...

  3. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...

  4. SpringMVC学习笔记之---简单入门

    SpringMVC简单入门 (一)什么是MVC设计模式 (1)model:模型数据,业务逻辑 (3)view:呈现模型,与用户进行交互 (3)controller:负责接收并处理请求,响应客户端 (二 ...

  5. springMVC学习笔记(一)-----springMVC原理

    一.什么是springmvc springMVC是spring框架的一个模块,springMVC和spring无需通过中间整合层进行开发. springMVC是一个基于mvc的web框架. Sprin ...

  6. [SpringMVC]SpringMVC学习笔记一: springmvc原理及实例解析.

    前言:今天来回顾下SpringMVC的开发原理, 使用图文并茂的方式 来解析其中的内幕, 我相信懂了其中的运行机制后, 对于面试中SpringMVC大家都可以说so easy了. 一, 图示法 第二张 ...

  7. springMVC学习笔记--初识springMVC

    前一段时间由于项目的需要,接触了springMVC(这里主要是讲3.1版,以下内容也是围绕这个版本展开),发觉其MVC模式真的很强大,也简单易用,完全是基于注解实现其优雅的路径配置的.想想以前接手的项 ...

  8. SpringMVC学习笔记:SpringMVC框架的执行流程

    一.MVC设计模式 二.SpringMVC框架介绍 三.SpringMVC环境搭建 四.SpringMVC框架的请求处理流程及体系结构

  9. SpringMVC学习笔记七:SpringMVC的数据验证

    SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hib ...

随机推荐

  1. 配置VMware中的Ubuntu能够被其他机器ssh远程

    配置虚拟机Ubuntu能够被其他机器 ssh远程 将虚拟机Ubuntu改成桥接模式 在Ubuntu中安装openssh sudo apt install openssh-server -y sudo ...

  2. 本人编写的一份前端vue面试题

    说明,此题目本人自出,做过本人所在公司的前端面试题,在此共享给大家 1. 如何在vue组件中实现v-model的功能?(只需给出关键代码) 2. 简述你知道的生命周期函数和执行时机 3. 谈谈你对计算 ...

  3. How to Change Master Page @ Run-time

    This tip will give complete knowledge of how to change master page, render controls and accessing it ...

  4. RAD 10 新控件 TSearchBox TSplitView

    Seattle新控件 1.TSearchBox Events OnInvokeSearch published Occurs when the search indicator button is c ...

  5. mysql之提示符

    MySQL常用的简单的命令: mysql> PROMPT \u@\h \d> PROMPT set to '\u@\h \d>' root (none)>USE test Da ...

  6. java tcp socket实例

    java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...

  7. 【HDU4966】GGS-DDU

    题意 有n种科目,每个科目都有一个最高的等级a[i].开始的时候,每个科目的等级都是0.现在要选择一些课程进行学习使得每一个科目都达到最高等级.这里有m节课可供选择.对于每门课给出L1[i],c[i] ...

  8. 9. Palindrome Number 回文数的判断

    [抄题]: Determine whether an integer is a palindrome. An integer is a palindrome when it reads the sam ...

  9. 25.AVG 函数

    定义和用法 AVG 函数返回数值列的平均值.NULL 值不包括在计算中. SQL AVG() 语法 SELECT AVG(column_name) FROM table_name SQL AVG() ...

  10. CF 1091E New Year and the Factorisation Collaboration

    昨晚Good Bye 2018D题没做出来,车翻大了…… 官方题解      传送门 初赛知识:一个无向图所有顶点度数之和为偶数.然而这东西还有一个高端的名字:Handshaking lemma 但是 ...