Spring简单的文件配置

Spring简单的文件配置

“计应134(实验班) 凌豪”

一、Spring文件配置

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,我们这里为了兼容版本较低的Servlet容器(实际上我采用的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的理解。

二、控制反转和依赖注入

控制反转(Ioc/Inverse Of Control):调用者不再创建被调用者的实例,由Spring框架实现(容器创建)所以称为控制反转。

依赖注入(DI/Dependence injection):容器创建好实例后再注入被调用者称为依赖注入。

当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例),被调者的协助时,在传统的程序设计中,通常由调用者来创建被调者的实例。如果创建调用者的实例的工作不再由调用者来完成,而是由外部容器完成,因此称为控制反转;创建被调者实例的工作通常由外部容器来完成,然后注入调用者,因此称为依赖注入

依赖注入的三种实现形式:

1.Type1-接口注入(Interface Injection)

它是在一个接口中定义需要注入的信息,并通过接口完成注入。Apache Avalon是一个较为典型的Type1型IOC容器,WebWork框架的IoC容器也是Type1型。

当然,使用接口注入我们首先要定义一个接口,组件的注入将通过这个接口进行。我们还是以用户注册为例,我们开发一个InjectUserDao接口,它的用途是将一个UserDao实例注入到实现该接口的类中。InjectUserDao接口代码如下:

public interface InjectUserDao {

    public void setUserDao(UserDao userDao);

}

UserRegister需要容器为它注入一个UserDao的实例,则它必须实现InjectUserDao接口。UserRegister部分代码如下:

public class UserRegister implements InjectUserDao{

    private UserDao userDao = null;//该对象实例由容器注入

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

// UserRegister的其它业务方法

}

同时,我们需要配置InjectUserDao接口和UserDao的实现类。如果使用WebWork框架则配置文件如下:

<component>

        <scope>request</scope>

        <class>com.dev.spring.simple.MemoryUserDao</class>

        <enabler>com.dev.spring.simple.InjectUserDao</enabler>

</component>

这样,当IoC容器判断出UserRegister组件实现了InjectUserDao接口时,它就将MemoryUserDao实例注入到UserRegister组件中。

2.Type2-设值方法注入(Setter Injection)

在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得力于Spring框架的影响)。

基于设置模式的依赖注入机制更加直观、也更加自然。前面的用户注册示例,就是典

型的设置注入,即通过类的setter方法完成依赖关系的设置。

3.Type3-构造子注入(Constructor Injection)

构造子注入,即通过构造函数完成依赖关系的设定。将用户注册示例该为构造子注入,UserRegister代码如下:

public class UserRegister {

    private UserDao userDao = null;//由容器通过构造函数注入的实例对象

    public UserRegister(UserDao userDao){

        this.userDao = userDao;

    }

    //业务方法

}

原文地址:https://www.cnblogs.com/linghao713/p/4571810.html