zoukankan      html  css  js  c++  java
  • Spring入门

    Spring入门

    此内容仅为初学的朋友准备,因为小弟也是刚开始看Spring,希望各位高人不要拿小弟开刀

    要明白Spring是干什么的,或者说是Spring为了什么被创造出来,这个十分重要,简单的说就是为了“更方便的帮助我们创造对象”

    来回顾一下j2ee中创建对象的几种模式(注意不是j2se):

    1.使用new 来构造对象,此处不具体说明了,坏处是接口和实现类紧密耦合通常只是创建vo(pojo)时才使用

    2.使用Factory 工厂类来创建对象,解决了1 里 实现类和接口紧密耦合的问题,但是带来了新的问题,当接口很多时代码量很大

    3.使用Spring(其实就是个大的Factory)来构造对象


    首先我们创建一个接口(我就不截图了)

    package com.lizhe.interf;

    public interface Fruit {
        public void eat();
    }

    此接口定义一个“水果”接口,然后定义了一个方法“吃”

    再定义两个实现类“苹果”和“橘子”

    package com.lizhe.Impl;

    import com.lizhe.interf.Fruit;

    public class Apple implements Fruit {
        public void eat() {
           // TODO Auto-generated method stub
           System.out.println("吃苹果");
        }
    }

    ----------------------------------------------------------------------------------------------------------
    package com.lizhe.Impl;
    import com.lizhe.interf.Fruit;

    public class Orange implements Fruit {
        public void eat() {
           // TODO Auto-generated method stub
           System.out.println("吃橘子");
        }
    }

    ----------------------------------------------------------------------------------------------------------
    如果我们要调用eat这个方法就要得到一个“水果”接口的实例

    如上所述我们有3种方法

    1.紧密耦合的new方法

    Fruit f=new Apple();
    f.eat();

    2.使用工厂的Factory 方法

    Fruit f=Factory.getApple();
    f.eat();

    3.使用Spring的Ioc 方法

    首先配置一个Spring配置文件applicationContext.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans

    -2.0.xsd">
        <bean id="fru" class="com.lizhe.Impl.Apple"></bean>
        <bean id="fru2" class="com.lizhe.Impl.Orange"></bean>
    </beans>

    注意此配置文件只做了一件事,就是将com.lizhe.Impl.Apple和com.lizhe.Impl.Orange重新命名为fru和fru2,这里只给出了实现类,而并有

    提及这两个类使用的是哪两个接口,读者可能有疑问,大家往下看很容易明白

    接着我们在一个普通的j2se类中测试我们的程序

    package com.lizhe.test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    import com.lizhe.interf.Fruit;

    public class Test {
        public static void main(String args[]) {
           ApplicationContext ctx = new FileSystemXmlApplicationContext("/src/applicationContext.xml");
           Fruit f = (Fruit) ctx.getBean("fru");
           Fruit f2= (Fruit) ctx.getBean("fru2");
           f.eat();
           f2.eat();
        }
    }


    注意下面这两句
    Fruit f = (Fruit) ctx.getBean("fru");
    Fruit f2= (Fruit) ctx.getBean("fru2");

    这两句使用fru和fru2就得到了Apple和Orange的实例,并且标注了他们返回的实例的接口类型是fruit,当我们要修改项目的时候,只需要修改

    applicationContext.xml中的
    <bean id="fru" class="com.lizhe.Impl.Apple"></bean>
        <bean id="fru2" class="com.lizhe.Impl.Orange"></bean>

    这两句就可以获得不同的实例,大大降低了代码的耦合度,当接口很多的时候也不会产生很大的代码量,这正是Spring的方便所在.


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

    应一位朋友的要求,写一个最简单的spring示例,使用spring的MVC,并应用了spring的依赖注入,实现简单应用,索性放在这里供还没入门的

    spring爱好者参考,初步感受一下spring应用(spring高手就不必看了,这里并没有涉及高级特性,比如与ORM框架的整合,事务管理,远程调

    用,代理等这些功能)

      spring至关重要的一环就是装配,即配置文件的编写,接下来我按刚才实际过程中一步步简单讲解。

      首先,要在web.xml中配置DispatcherServlet,它是作为Spring MVC的前端控制器.必须在web.xml中配置好,如下

    <servlet>
    <servlet-name>ntx</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

      实际上,spring的配置文件可以分切到多个xml文件,我们这个简单的示例就把它配置到ntx.xml中

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC
    "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans
    default-autowire="no"
    default-lazy-init="false"
    default-dependency-check="none"

    <bean id="loginService" class="ntx.service.serviceimpl.LoginServiceImpl"/>

    <bean id="loginController" class="ntx.controller.LoginController">
    <property name="loginService">
    <ref bean="loginService"/>
    </property>
    <property name="gotoUrl">
    <value>/showResult.jsp</value>
    </property>
    </bean>

    <bean id="SimpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
    <props>
    <prop key="/userLogin.do">loginController</prop>
    </props>
    </property>
    </bean>
    </beans>

      配置好上面的这些后,要在WEB-INF下要建立ntx-servlet.xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
     <property name="prefix"><value></value></property>
     <property name="suffix"><value></value></property>
    </bean>
    </beans>

      接下来,要指明哪些请求将交给spring的DispatcherServlet来处理,所以在web.xml中添加<servlet-mapping>

    <servlet-mapping>
     <servlet-name>ntx</servlet-name>
     <url-pattern>*.do</url-pattern>
    </servlet-mapping>

      为了能正确载入DispatcherServlet等配置文件,我们要在web.xml中配置一个上下文载入器ContextLoaderListener或者

    ContextLoaderServlet,我们这里为了兼容版本较低的Serlvet容器(实际上我采用的2.4),采用第二种:

    <servlet>
     <servlet-name>context</servlet-name>
     <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
     <load-on-startup>100</load-on-startup>
    </servlet>

      这样就全部配置完毕了,当然,上面的ntx.xml是我在项目完成以后才配置完成的,这里不再多讲,有bean元素的配置大家可以参考有关资

    料理解,很容易理解的,下面再给出完整的web.xml配置以及java<?xml version="1.0" encoding="UTF-8"?>

    <web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/ntx.xml</param-value>
    </context-param>
    <servlet>
     <servlet-name>ntx</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
     <servlet-name>context</servlet-name>
     <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
     <load-on-startup>100</load-on-startup>
    </servlet>
    <servlet-mapping>
     <servlet-name>ntx</servlet-name>
     <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

      根据ntx.xml知道,总共有三个java文件,LoginController.java是控制器,继承了最简单的Controller(实际上spring有很多控制器供我们

    选择),接下来是一个简单控制器的源码:

    /** *//**
    * program NtxSpring
    * date 2006-9-27
    * @author 张逸轩
    */
    package ntx.controller;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;

    import ntx.service.LoginService;

    /** *//**@spring.bean id="loginController"
    * @spring.property name="gotoUrl" value="/showResult.jsp"
    * @spring.property name="loginService" ref="loginService"
    */

    /** *//**
    * 作用描述:spring示例
    *
    * 说明:spring示例,以上的spring标签方便使用xdoclet生成spring配置文件
    *
    * @author 张逸轩
    * Copyright(c)2006 cleverfox
    */
    public class LoginController implements Controller...{

    private LoginService loginService ;
    private String gotoUrl;
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception ...{
     String userName = request.getParameter("userName");
     this.getUserInfo(request, userName);
     return new ModelAndView(this.getGotoUrl());
    }

    private void getUserInfo(HttpServletRequest request,String userName)...{
     String userInfo = loginService.getUserInfo(userName);
     request.setAttribute("userInfo", userInfo);
    }

    public String getGotoUrl() ...{
     return gotoUrl;
    }
    public void setGotoUrl(String gotoUrl) ...{
     this.gotoUrl = gotoUrl;
    }
    public LoginService getLoginService() ...{
     return loginService;
    }
    public void setLoginService(LoginService loginService) ...{
     this.loginService = loginService;
    }

    }

      还有service层的接口以及实现,较简单。

    package ntx.service;
    public interface LoginService ...{
     public String getUserInfo(String userName);
    }package ntx.service.serviceimpl;

    import ntx.service.LoginService;

    public class LoginServiceImpl implements LoginService ...{
     public String getUserInfo(String userName)...{
      return "你的名字是:" + userName;
     }
    }

      好了,最后是两个jsp文件,一个index.jsp用来显示一个表单,输入名字,一个showResult.jsp用来显示结果,只贴出相关的代码:

    <body>
    This is my Test Spring page. <br>
    <div>
    <form method="post" action="/userLogin.do">
    <input type="text" name="userName" size="30"/><br/>
    <input type="submit" value="提交"/>
    </form>
    </div>
    </body>

    <body>
    This is the Result: <br>
    <c:out value="${userInfo}" default="没有结果"/>
    </body>

      发布到tomcat或者其它Servlet容器可以正常使用,提交以后将显示:

      This is the Result:

      你的名字是:gavin


    这是一个简单的入门示例,希望有助于刚接触spring的人加深对spring的理解。

  • 相关阅读:
    管理者如何保持团队稳定性
    信息系统项目管理师考试之案例分析答题技巧
    【信息系统项目管理师】信息系统项目管理师计算题汇总
    [转]信息系统项目管理师计算题汇总
    Oracle
    PLSQL中查询数据的时候查询结果显示中文乱码
    项目管理知识体系指南(PMBOK 指南)
    linux查看分区命令和根分区扩容方法
    docker启动命令,docker重启命令,docker关闭命令
    iOS与JavaScript交互三: MessageHandler--window.webkit.messageHandlers.<name>.postMessage(<messageBody>)
  • 原文地址:https://www.cnblogs.com/bluespot/p/1098453.html
Copyright © 2011-2022 走看看