一,Spring介绍
Spring 的 web 框架围绕 DispatcherServlet 设计。 DispatcherServlet 的作用是将
请求分发到不同的处理器。从 Spring 2.5 开始,使用 Java 5 或者以上版本的用户可以采
用基于注解的 controller 声明方式。官网上说 Spring 的 web 模块提供了大量独特的功能,
包括 :
清晰的角色划分:
控制器(controller)、验证器(validator)、 命令对象(command object)、表
单对象(form object)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、
处理器映射(handler mapping)、视图解析器(view resolver)等等。 每一个角色都
可以由一个专门的对象来实现。
强大而直接的配置方式:
将框架类和应用程序类都能作为 JavaBean 配置,支持跨多个 context 的引用,例如,
在 web 控制器中对业务对象和验证器(validator)的引用。
可适配、非侵入:
可以根据不同的应用场景,选择合适的控制器子类 (simple 型、command 型、form
型、wizard 型、multi-action 型或者自定义),而不是从单一控制器 (比如 Action/
ActionForm)继承。
可重用的业务代码:
可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
可定制的绑定(binding) 和验证(validation):
比如将类型不匹配作为应用级的验证错误,这可以保存错误的值。再比如本地化的日
期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并
转换到业务对象。
可定制的 handler mapping 和 view resolution:
Spring 提供从最简单的 URL 映射,到复杂的、专用的定制策略。与某些 web MVC 框架
强制开发人员使用单一特定技术相比,Spring 显得更加灵活。
灵活的 model 转换:
在 Springweb 框架中,使用基于 Map 的 键 / 值对来达到轻易地与各种视图技术的集成。
可定制的本地化和主题(theme)解析:支持在 JSP 中可选择使用 Spring 标签库、支
持 JSTL、支持 Velocity(不需要额外的中间层)等等。
简单而强大的 JSP 标签库(Spring Tag Library):
支持包括诸如数据绑定和主题(theme) 之类的许多功能。它提供在标记方面的最大
灵活性。
JSP 表单标签库:
在 Spring2.0 中引入的表单标签库,使得在 JSP 中编写 表单更加容易。
Spring Bean 的生命周期可以被限制在当前的 HTTP Request 或者 HTTP Session。
准确的说,这并非 Spring MVC 框架本身特性,而应归属于 Sping MVC 使用的
WebApplicationContext 容器。
二,Spring mvc 架构图。
ssm(spring mvc【servlet】 作用就是你的controller(控制层)
spring-mvc是spring框架分解出来的一部分。
spring mvc 的执行过程:第一步:客户端发送请求 dispacherServlet
把相应的请求给handerMapping(HanderAdapter进行处理(处理比如到哪个界面,数据返回带哪个界面,对数据要做哪些处理)),返回一个modeAndView 数据和视图。
把返回的信息给dispacherServlet 再给视图渲染器(viewR) 还会返回dispacherServlet 这样才能看到好的网页。
几个核心对象: dispacherServlet,HanderAdapter,视图渲染器。
组件说明
以下组件通常使用框架提供实现:
◆ DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个
流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了
组件之间的耦合性。
◆ HandlerMapping: 处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,springmvc 提供了不同的
映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
◆ Handler: 处理器
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet
的控制下 Handler 对具体的用户请求进行处理。
由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开
发 Handler。
◆ HandlAd apter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器
可以对更多类型的处理器进行执行。
◆ ViewResolver:视图解析器
ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名
解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将
处理结果通过页面展示给用户。 springmvc 框架提供了很多的 View 视图类型,包括:
jstlView、freemarkerView、pdfView 等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要
由程序员根据业务需求开发具体的页面。
三,程序步骤.
开发一个基础的springmvc的框架项目:
1.先导包。:核心包—spring-webmvc-3.2.13.reelease
2.核心 xml文件 springmvc,xml配置:
在 web.xml 配置前端控制器:DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--第一个运行-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.配置spring.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--第一版本:当你的请求地址是index.html的时候就会到UserController-->
<bean name="/index.html" class="com.offcn.contorller.UserController"></bean>
<!--完成视图的对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--开始配置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--开始配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
第二版注解版:
<!--注解版,扫描contorller所有包-->
<context:component-scan base-package="com.offcn.contorller"></context:component-scan>
<!--开启注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--完成视图的对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--开始配置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--开始配置后缀-->
<property name="suffix" value=".jsp"></property>
4.创建jsp文件。
5.配置srpingmvc.xml。
@org.springframework.stereotype.Controller
//用此语句。这个进入网页时 就必须输入前缀,
@RequestMapping("/UserController")*/
public class UserController {
//第一版本 需要接口
implements Controller
/*这个方法,当你的客户端发送请求的url地址,跟这个类对应上 就会走这个方法(HanderMapping)*/
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//return就是你要跳转的页面,参数就是处理后要跳转的界面
return new ModelAndView ("doIndex");
}
传递参数的注解版版本,此版本必须添加参数
@RequestMapping("index")
public String index1(@RequestParam("userName")String userName){
System.out.println (userName);
return "doIndex";
}
//value代表你添加的键,required = false,代表传递的参数可有可无,true带表必须拼接
@RequestMapping("index")
public String index1(@RequestParam(value = "userName",required = false)String userName){
System.out.println (userName);
return "doIndex";
}
还有一个版本,这种必须传参数,设置请求方式。报405方式的错误是因为你的接受方式不统一get/post一
//value = "/index/*.do"只要你的index下面的,以do结尾的都能够匹配到
@RequestMapping(value = "index",params = {"userName"},method = RequestMethod.GET)
public String index2(String userName){
System.out.println (userName);
return "doIndex";
}
PathVariable这个注解就是匹配你的uri上的任何参数,
注解上的userName,跟你的userName一定要一样,才能拿到你的具体数据 传两个参数此方法不能实现*/
@RequestMapping(value = "/index/{userName}")
public String index3(@PathVariable String userName){
System.out.println (userName);
return "doIndex";
}
/*以上是jsp页面传入controller层*/
以上是jsp页面传入controller层
6.把controller层传入jsp页面中
第一版本:
实例化model
@RequestMapping("/toDoIndex")
public ModelAndView toDoIndex(@RequestParam(value = "username",required = false)String username){
//获取userName
/*构建modelAndView对象*/
ModelAndView modelAndView=new ModelAndView ();
/*把值放入modelAndView里面,以键值对的形势传递*/
modelAndView.addObject ("userName",username);
//把要跳转的界面放到modeANDview里
modelAndView.setViewName ("doIndex");
return modelAndView;
}
/返回值就是我们要跳转的地址 view model不用实例化出来,直接传进去。此版本也常用
@RequestMapping("/toDoIndex1")
public String toDoIndex1(String userName,Model model){
//model里面添加数据,同样也是键值对的方式来传递参数
System.out.println (userName);
model.addAttribute ("username",userName);
return "doIndex";
}
运用map的版本
@RequestMapping("/toDoIndex2")
public String toDoIndex2(String userName, Map<String,Object> map){
map.put ("userName",userName);
return "doIndex";
}
常用版本2.0
@RequestMapping("/toUpdate")
public String toUpdate(@RequestParam(value = "userName",required = false)String userName,@RequestParam(value = "pwd",required =true)String pwd,Model model){
model.addAttribute ("username",userName);
return "doIndex";
}
四,一个实例。
创建一个user对象 用集合添加,然后在网页中用表格显示:
创建pojo.User类
配置xml
package com.offcn.controller;
import com.offcn.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.lang.reflect.AnnotatedArrayType;
import java.util.ArrayList;
import java.util.List;
@Controller
public class UserController {
@RequestMapping("/toIndex")
public String toIndex(Model model){
System.out.println ("1234579");
List<User> userList = new ArrayList<User> ();
User user1=new User ();
user1.setUserName ("谢");
user1.setId (1);
user1.setPwd ("1");
User user2=new User ();
user2.setUserName ("王");
user2.setId (2);
user2.setPwd ("2");
User user3=new User ();
user3.setUserName ("白");
user3.setId (3);
user3.setPwd ("3");
userList.add (user1);
userList.add (user2);
userList.add (user3);
model.addAttribute ("userList",userList);
return "tableNew";
}
}
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>
<div>
<table align="">
<tr>
<th>id</th> <th>姓名</th> <th>密码</th>
</tr>
<c:forEach var="userList" items="${userList}">
<tr>
<td>${userList.id}</td> <td>${userList.userName}</td> <td>${userList.pwd}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>