java---springmvc

来源:互联网 发布:区域增长算法示意图 编辑:程序博客网 时间:2024/06/05 11:31

 体验springmvc


Springweb mvc替换struts框架的,springmvc侧地将struts替换掉了。

 

Spring框架是业务层框架,核心组件是容器

它是管理bean的,广义上讲任何一个java类都是一个Bean,它都可以管理,

例如:实例化对象

两大概念:

IoC(Inversion of Control) 反转控制,

DI(Dependency injection) 依赖注入,动态向某个对象提供它所需要的对象

获得对象的一种方式

AOP(Aspect Oriented Programming) 面向切面编程,也叫面向方面编程


 

Struts2工作流程


 

Spring mvc框架


­­­

l  Dispatcher Servlet分发器

l  Handler Mapping 处理器映射

l  Controller 控制器

l  ModelAndView

l  ViewResolver 视图解析器

 

Spring-framework v3.2.2

Spring-framework下载地址:

http://www.springsource.org/spring-framework

 

Spring mvc开发步骤

  1. 新建web project

1、新建工程,编码为UTF-8,否则中文乱码。用jdk1.6以上版本编译。

 

  1. 创建jsp文件

2、创建jsp文件    WEB-INF/jsps/index.jsp

<%@ pagelanguage="java" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">

<html>

 <head>

   <title>index.jsp</title>

 </head>

 

 <body style="background-color:black;">

<div style="padding:250px 0px 0px500px;color:white;font-size:24px;font-family:Impact;">

   This is my JSP page. <span style="color:red;">springMVC</span>  <br>

</div>

 </body>

</html>

 

 

 

  1. 需求

访问index.jsp

/WEB-INF/jsps/index.jsp

在浏览器地址栏敲入:

http://localhost:8090/springmvc/home.action

 

 

  1. 引入jar包

4、引入spring3.2.2 的jar包( 9个核心包2个依赖包)

l  spring-aop-3.2.2.jar 面向切片编程

l  spring-aspects-3.2.2.jar 提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中

l  spring-beans-3.2.2.jar 核心。访问配置文件、创建和管理bean 以及进行IoC/DI操作相关的所有类。

l  spring-context-3.2.2.jar为Spring 核心提供了大量扩展。

l  spring-context-support-3.2.2.jar

l  spring-core-3.2.2.jar Spring 框架基本的核心工具类。外部依赖CommonsLogging 。

l  spring-expression-3.2.2.jar 配置对象的注入,它便是SpEL(Spring Expression Language)

l  spring-web-3.2.2.jar Web 应用开发时,用到Spring 框架时所需的核心类

l  spring-webmvc-3.2.2.jar Spring MVC 框架相关的所有类。包括框架的Servlets,Web MVC框架,控制器和视图支持。

l            注意spring3.0的包名是 org.spingframework.web.servlet-3.1.0RELEASE.jar

l  com.springsource.org.apache.commons.logging-1.1.1.jar 日志

l  com.springsource.org.aopalliance-1.0.0.jar  AOP联盟的API包,里面包含了针对面向切面的接口。

 

  1. 配置分发器 DispatcherServlet

在web.xml中配置 分发器Servlet

<servlet>

         <servlet-name>action</servlet-name>

         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>

         <servlet-name>action</servlet-name>

         <url-pattern>*.action</url-pattern>

</servlet-mapping>

 

 

 

  1. 创建控制器类 HomeController

 

package cn.itcast.springmvc.controller;

importjavax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

importorg.springframework.web.servlet.ModelAndView;

importorg.springframework.web.servlet.mvc.AbstractController;

public class HomeController extendsAbstractController {

         protectedModelAndView handleRequestInternal(HttpServletRequest request,

                 System.out.println(request.getContextPath()+ request.getServletPath());                                          HttpServletResponseresponse) throws Exception {

                   returnnew ModelAndView("index");

         }

}

 

  1. 配置beans         //访问路径:prefix + logicName + suffix  

 

配置beans,创建spring配置文件   /WEB-INF/action-servlet.xml

 

<?xml version="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://www.springframework.org/schema/beans                                             http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

</beans>

        

         <!--控制器 -->                                  

         <beanname="/home.action"class="cn.itcast.springmvc.controller.HomeController"/>

        

         <!--内部资源视图解析器-->      

         <beanid="internalResourceViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                   <propertyname="prefix" value="/WEB-INF/jsps/"/>     <!-- 前缀 -->

                   <propertyname="suffix" value=".jsp"/>                   <!-- 后缀 -->

         </bean>

 

 

  1. 发布、测试


犯错:为什么名称叫做action-servlet.xml?

 

web.xml中声明的名称要和创建的文件名一致

修改一下web.xml中,将action改为smvc,重新启动tomcat,看会如何?

HTTP Status 500 -

--------------------------------------------------------------------------------

type Exception report

javax.servlet.ServletException:Servlet.init() for servlet smvc threw exception

root cause

org.springframework.beans.factory.BeanDefinitionStoreException:IOException parsing XML document from ServletContext resource [/WEB-INF/smvc-servlet.xml];nested exception is java.io.FileNotFoundException: Could not openServletContext resource [/WEB-INF/smvc-servlet.xml]

 

技术要点:修改action-servlet.xml文件名和位置?

l  移动action-servlet.xml到src目录下,改名为spring-mvc.xml

l  修改web.xml,给DispatcherServlet增加初始参数

 

<servlet>

         <servlet-name>action</servlet-name>

         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

         <init-param>

                   <param-name>contextConfigLocation</param-name>

                   <param-value>classpath:spring-mvc.xml</param-value>

         </init-param>

         <load-on-startup>1</load-on-startup>   //随容器一起启动

</servlet>

 

1.    handlerMapping


常用的处理器映射

1、BeanNameUrl处理器映射

默认处理方式

<!-- Bean名url处理器映射 -->

<beanid="beanNameUrlHandlerMapping"

         class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

</bean>

<!-- 控制器 -->

<bean id="homeController"name="/hi.action"class="cn.itcast.springmvc.controller.HomeController"></bean>

 

http://localhost:8090/springmvc/hi.action

 

2、简单url处理器映射

<!-- Bean名url处理器映射 -->

<bean id="beanNameUrlHandlerMapping"class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

</bean>

<bean id="simpleUrlHandlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

         <propertyname="mappings">

                   <props>

                   <propkey="/sh.action">homeController</prop>

                   <propkey="/a.action">homeController</prop>

                   <propkey="/b.action">homeController</prop>

                   </props>

         </property>

</bean>

<!-- 控制器 -->

<bean id="homeController"class="cn.itcast.springmvc.controller.HomeController"></bean>

 

Spring-beans-3.0.xsd 不支持id命名中有/

3.2xsd已经支持

 

 

技术要点:同名时谁起作用呢,是BeanName还是Simple呢?

 

<!-- Bean名url处理器映射 -->

<bean id="beanNameUrlHandlerMapping"class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

</bean>

<bean id="simpleUrlHandlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

 <property name="mappings">

 <props>

   <prop key="/sh.action">homeController</prop>

    <prop key="/a.action">homeController</prop>

   <prop key="/b.action">homeController</prop>

   <prop key="/hi.action">homeController</prop>

   </props>

 </property>

</bean>

<!-- 控制器 -->

<bean id="homeController"  name=“/hi.action”class="cn.itcast.springmvc.controller.HomeController"></bean>

 

 

注意:

1、默认顺序按xml配置的前后

DispatcherServlet.java 源代码p1086行,决定谁起作用

for (HandlerMapping hm :this.handlerMappings) {

}

2、按order属性排序

DispatcherServlet.java 源代码p533行,

OrderComparator.sort(this.handlerMappings);

3、p548 排序后的顺序

 

 

<!-- Bean名url处理器映射 -->

<bean id="beanNameUrlHandlerMapping"class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

         <property name="order"value="0"/>

</bean>

<bean id="simpleUrlHandlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

         <propertyname="mappings">

                   <props>

                   <propkey="/hi.action">homeController</prop>

                   </props>

         </property>

         <!--设置优先级,数字越小优先级越高-->

         <propertyname="order" value="1"/>

</bean>

<!-- 控制器 -->

<bean id="homeController"  name=“/hi.action”class="cn.itcast.springmvc.controller.HomeController"></bean>

 

 

spring-webmvc-3.2.2.jar

DispatcherServlect.class 源码 行533

initHandlerMappings

 

3、控制器类名处理器映射

<!-- 控制器类名处理器映射 -->

<beanid="controllerClassNameHandlerMapping"

         class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">

   <property name="order" value="2"/>

</bean>

原理:在容器启动时处理

在源码中下面的地方配置断点ControllerClassNameHandlerMapping.class p139

String path =(className.endsWith(CONTROLLER_SUFFIX) ?

         className.substring(0,className.lastIndexOf(CONTROLLER_SUFFIX)) : className);

规则:得到类名HomeControlller,将Controller去掉,剩下的全部小写。如多个单词也全小写

 

qhttp://localhost:8090/x_springmvc/home.action

http://localhost:8090/x_springmvc/homeController.action

 

 

2.    controller

常见的处理Controller


1、CommandController命令控制器


将参数封装在

Command Object对象中

创建javabean,绑定数据

packagecn.itcast.springmvc.domain;

public classPerson {

         private Integerid;

         privateString name;

         privateInteger age;

         …

         publicString toString() {

                   return"Person [id=" + id + ", name=" + name + ", age="+ age + " ]";

         }

}

 

public class PersonCommandControllerextends AbstractCommandController {

         publicPersonCommandController(){

                   //注册命令类

                   this.setCommandClass(Person.class);

                   this.setCommandName("person");

         }

         protectedModelAndView handle(HttpServletRequest request,

                            HttpServletResponseresponse, Object command, BindException errors)

                            throwsException {

                   Personp = (Person) command;

                   System.out.println(p.toString());

                  

                   returnnew ModelAndView("index");

         }<!--命令控制器 -->

<bean id=“personCommandController"class="cn.itcast.springmvc.controller.PersonCommandController">

</bean>

http://localhost:8090/springmvc/personcommand.action

Console 控制台输出:

l  Person [id=null, name=null, age=null ]

http://localhost:8090/springmvc/personcommand.action?id=1&name=tony&age=29

l  Person [id=1, name=tony, age=29 ]

 

2、SimpleFormController简单表单控制器

 

public class PersonFormController extendsSimpleFormController {

        

         //注册命令对象

         publicPersonFormController() {

                   this.setCommandClass(Person.class);

                   this.setCommandName("person");

         }

         protectedvoid doSubmitAction(Object command) throws Exception {

                   Personp = (Person) command;

                   System.out.println(p.toString());

         }

}

 

spring-mvc.xml

<!-- 表单控制器(处理表单提交) -->

<beanid="personFormController" class="cn.itcast.springmvc.web.controller.PersonFormController">             

         <!-- 表单视图 -->

         <property name="formView"value=“jPersonCreate"/>

         <!-- 成功视图 -->

         <propertyname="successView" value="index"/>

</bean>

 

 

4 springMvc注解入门

5 列表功能实现

4      修改新增删除功能实现

5      上传图片校验

 

9 整合hibernate

Spring源码

Application.xml

<?xmlversion="1.0" encoding="utf-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                   xmlns:context="http://www.springframework.org/schema/context"

                   xmlns:tx="http://www.springframework.org/schema/tx"

                   xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd

                                     http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd

                                     http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 

</beans>

 

 

ApplicaionContextUtil  单态的application加载类

package com.util;

 

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

 

final publicclass ApplicaionContextUtil {

 

         private static ApplicationContextac=null;

        

         private ApplicaionContextUtil(){

                  

         }

        

         static{

                   ac=newClassPathXmlApplicationContext("applicationContext.xml");

         }

         public static ApplicationContextgetApplicationContext(){

                   return ac;

         }

        

}


0 0