2009.12.16——谢讲的关于项目

2009.12.16——谢讲的关于项目
我们的整体架构,就是hibernate+spring+springMVC+flat+jquery

一.先大致说spring MVC里面web.xml的配置
web.xml
==============================================================================================
<?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">

<!-- 加入 spring 支持 bean-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring.xml</param-value>
</context-param>
<!-- 加入 spring 支持 log4j-->

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/classes/log4j.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<!--一个字符编码的过滤器-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- sprig mvc配置-->
<servlet>
<servlet-name>khms-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

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


</web-app>
===============================================================================================


org.springframework.web.servlet.DispatcherServlet,DispatcherServlet负责分配请求至控制对象Controller(即原来的action),controller要实现org.springframework.web.servlet.mvc.Controller这个接口,必须实现
public ModelAndView handleRequest(HttpServletRequest request
,HttpServletResponse response) throws Exception
{}
这个方法。
controller收到DispatcherServlet的分配请求,会执行handleRequest方法,返回一个org.springframework.web.servlet.ModelAndView对象。

具体步骤:

1.配置分发器(DispatcherServlet)
DispatcherServlet 是Spring MVC 的入口
所有进入Spring Web 的 Request 都经过 DispatcherServlet
需要在 web.xml 中注册 DispatcherServlet
<servlet>
<servlet-name>khms-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>


加载 DispatcherServlet 时 Spring 会尝试读取配置文件 默认的配置文件位于 web.xml 相同的路径下 文件名与注册的 Servlet 名有关 Servlet注册名跟上 -servlet.xml
例如:上面的 Servlet 注册名为 khms-mvc 那么 默认的
配置文件名位:khms-mvc-servlet.xml

注册 DispatcherServlet 后 还应指定有 Spring 处理的 url 模板
<servlet-mapping>
<servlet-name>khms-mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

这样 请求 .do 的处理 就全部交由 Spring 处理了
2. 配置文件读取器(可选)
当程序越来越大 配置文件中的 <bean> 越来越多 而且变得关系错综复杂 难于维护 此时应该考虑 将配置文件拆分成多个 为了让 Spring 能够读到这些配置文件 并察觉到他们的变化
需要注册配置文件读取器
<listener> 
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

然后 指定配置文件列表
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring.xml</param-value>
</context-param>


3.配置映射响应器(HandlerMapping)
当客户请求到来时,DispatcherServlet会根据HandlerMapping来决定,将请求分配到对应的Controller
一般常用的两种HandlerMapping:
3.1 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
这个是默认的映射响应器
<bean id="urlMapping" 
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />


这个可写可不写,因为是默认的,然后根据 <bean> 的 name 属性查找控制器(Controller)处理请求
<bean name="/hello.do" class="controller.HelloController">
<property name="" ....>
</bean>

BeanNameUrlHandlerMapping是直接url模板(即<bean>的name)和

3.2 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
这个是最常用的映射响应器,通过对其 mappings 进行设置 从而获得更为灵活的
控制器查找机制
<bean id="urlMapping" 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/<!-- url 模板 -->.do"><!-- 控制器 <bean> 的 id --></prop>
</props>//<bean>的id是下一步控制器中配置的<bean>的id
</property>
</bean>

例如:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">helloController</prop>
</props>//这个helloController就是接下来配置控制器<bean>中的id
</property>
</bean>

3.3 org.springframework.web.servlet.handler.metadata.CommonsPathMapHandlerMapping
CommonsPathMapHandlerMapping 应用了 jdk1.5 后的新特性 通过 Controller 中的注释 进行映射
在类中加入
@@org.springframework.web.servlet.handler.commonsattributes.PathMap("/path.do") 


<bean id="urlMapping" 
class="org.springframework.web.servlet.handler.metadata.CommonsPathMapHandlerMapping" />



4.配置控制器(Controller)
当 DispatcherServlet 接到请求后 通过 HandlerMapping 找到请求所对应的处理控制器后
在 mvc-servlet.xml 中 查找相对应得 <bean> 处理请求

4.1 当映射响应器为BeanNameUrlHandlerMapping时,
<bean name="/hello.do" class="controller.HelloController">
<property name="" ....></property>
</bean>

name即为url模板,直接和Controller类对应
4.2 当映射响应器为SimpleUrlHandlerMapping时,
<bean id="helloController" class="controller.HelloController">
<property name="">...</property>
</bean>
各个控制器应保证 <bean> 的 id 属性与 SimpleUrlHandlerMapping 中的 mappings 对应

4.3 当映射响应器为CommonsPathMapHandlerMapping
/** 
* @@org.springframework.web.servlet.handler.
commonsattributes.PathMap("/hello.do")
*/
public class HelloController
extends AbstractCommandController {
...
}



5.配置试图解析器(ViewResolver)
<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>.jsp</value></property>
<property name="contentType"><value>text/html;charset=utf-8</value></property>
</bean>



====================================================
二.EasyMock 在某些方法只有接口而没有使显示 前台程序员模拟方法的返回值,来完成功能的测试
easymock-2.5.2.jar 这个是jar包
根据昨天的理解 感觉 easyMock主要是针对接口的
一个例子:
接口
public interface DT_RGNCDDao{
public List getDT_RGNCDS();
}
如果这个接口 没有被实现 而我需要用 这是 就需要EasyMock了
测试:
public void testEasyMock(){
DT_RGNCDDao dao = EasyMock.createMock(DT_RGNCDDao.class);//给一个类对象 返回这个类的实 例
List DT_RGNCDS = new ArrayList();
DT_RGNCD one = new DT_RGNCD();
DT_RGNCDS.add(one);
//从上面那个接口可以看出来 getDT_RGNCDS()方法返回的是一个list
//现在我用expect()期望返回值是我刚定义的list对象
EasyMock.expect(dao.getDT_RGNCDS()).andReturn(DT_RGNCDS);
//replay()回放这个方法 这样就把getDT_RGNCDS()的返回值模拟成DT_RGNCDS了
EasyMock.replay(dao);
System.out.println(dao.getDT_RGNCDS().size());//结果为1
}


后来我试了一次 有个问题要注意
在replay()方法后 就已经把DT_RGNCDS赋给了getDT_RGNCDS()的返回值了,在这后面,我加上

List list = dao.getDT_RGNCDS();
System.out.println(list.size());
System.out.println(dao.getDT_RGNCDS().size());
这时 最后一行就会报错 错误如下:
Unexpected method call getDT_RGNCDS():
getDT_RGNCDS(): expected: 1, actual: 2]].//期望了一次,实际两次

但是当我吧最后一行去掉后
List list = dao.getDT_RGNCDS();
System.out.println(list.size());
//System.out.println(dao.getDT_RGNCDS().size());


这样就没错了

貌似意思是说replay()以后,被期望的方法如dao.getDT_RGNCDS()只能调一次


==========================================================
三.junit
就是白盒测试,如果我们要测试的话 总是要先去初始化一个实例,然后一个一个的调用类的各个方法,这样很麻烦,如果用junit就不用建实例了
下面是一个基础类,用于测试的类都继承这个类,就不用每次都去写xml文件的路径了

import org.apache.log4j.Logger;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

@ContextConfiguration(locations={"classpath:spring.xml","classpath:mvc- servlet.xml"},inheritLocations=false) //这个是spring的注解
public class TestBase extends AbstractTransactionalJUnit4SpringContextTests {
private static Logger log = Logger.getLogger(TestBase.class);
}

=============================================================================

import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;


public class TestYuliangService extends TestBase{//继承上面那个基础类

@Autowired //spring 自动装配
private HelloService helloService;//貌似也不用写get set方法



@Test
//@Ignore
public void test1(){
System.out.println("111111111111111111111");
}

//@Test
@Ignore //忽略当前方法
public void test2(){
System.out.println("22222222222222222222222");
}
}



@Autowired //spring的注解
spring的自动装配,如果不写这个,我们以前为了得到spring.xml里面的bean,就要先new一个ApplicationContext,然后根据getBean(),根据<bean>的id来得到这个类的实例,自动装配,我们就不需要这些了,可以直接用这个类的方法了
=========================================================================================================================

@Test //junit的
不用创建实例来测试某些方法,就可以直接在左边树里的方法上右键-run as-junit test就可以运行这个方法了
@Ignore //junit的
忽略当前方法 ,不测试这个方法 ,当运行整个类时,这个方法会被忽略 不测试

=========================================================================================================================

@SuiteClasses 自动化测试

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses(TestYuliangService.class)
public class TestSuitYuliangService {

}


@RunWith()
@SuiteClasses()括号里面的可以写多个,用逗号分隔,

创建一个空类作为测试套件的入口。
使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。
将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。
将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。
保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。

这样就会把TestYuliangService类里面的所有@Test的方法运行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值