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的方法运行
分享到:
相关推荐
python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目...
python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ...
C语言项目——企业员工管理系统.zip C语言项目——企业员工管理系统.zip C语言项目——企业员工管理系统.zip C语言项目——企业员工管理系统.zip C语言项目——企业员工管理系统.zip C语言项目——企业员工管理系统....
大创项目——区块链追溯系统.zip大创项目——区块链追溯系统.zip大创项目——区块链追溯系统.zip大创项目——区块链追溯系统.zip大创项目——区块链追溯系统.zip大创项目——区块链追溯系统.zip大创项目——区块链...
基于因子分析的我国A股上市...争力评价——以医药企业为例_张澳.caj
微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+...
微信小程序——我厨 tab 界面设计(截图+源码).zip 微信小程序——我厨 tab 界面设计(截图+源码).zip 微信小程序——我厨 tab 界面设计(截图+源码).zip 微信小程序——我厨 tab 界面设计(截图+源码).zip 微信...
1,安装说明.txt ——————————安装手册 2,jdk-170.tar.gz ——————————JDK1.7deb包 3,switch_java.sh -------------------------java其它版本切换 4,check_java.sh———————————版本...
【标题】与【描述】提及的是关于小学语文学习中的一个重要组成部分——歇后语。歇后语是中国传统文化中的一种独特语言现象,它结合了形象生动的比喻和巧妙的谐音,通常用于表达幽默、讽刺或者寓意深刻的观点。这些歇...
Geomagic.Studio.2012软件,由于太大,分成八个压缩包以及一个其他文件包。 此文件为part5
matlab课程设计——调幅广播系统的仿真设计 完整版.docxmatlab课程设计——调幅广播系统的仿真设计 完整版.docxmatlab课程设计——调幅广播系统的仿真设计 完整版.docxmatlab课程设计——调幅广播系统的仿真设计 ...
用此软件删除的文件,无法恢复,可以选择多种算法——已知的,即使是司法部门的特殊工作,仍然无法恢复,送给有特殊用途的人。 激活码是可以用的,显示到期是指技术支持到期,不是软件本身不可用。
分享的图书,有关Java SE 7 SDK标准的书,全英文。相应章节: Chapter 1. Introducing the Basics of Java Chapter 2. Applying Data Types in Java Programming Chapter 3....Chapter 4....Chapter 5....
录音软件MP3——Cooolsoft MP3 Sound Recorder2.88汉化版.exe录音软件MP3——Cooolsoft MP3 Sound Recorder2.88汉化版.exe录音软件MP3——Cooolsoft MP3 Sound Recorder2.88汉化版.exe录音软件MP3——Cooolsoft MP3 ...
16. 哭——笑 17. 臭——香 18. 丑——美 19. 出——入 20. 东——西 21. 有——无 22. 多——少 23. 古——今 24. 入——出 25. 穷——富 26. 轻——重 27. 细——粗 28. 快——慢 29. 爱——恨 30. 哭——笑 31. ...
—————————————————————————————————————————————————— 先运行 data_preprocess.py 确保 ./data/ 路径下生成 train_dataset.csv 和 test_dataset.csv 文件,后...
比如: 1.754 格式为2031373534——原本有效为为5位,但是1.754有效位为4位,所以默认为格式01.754,第一位是零位的话,格式以20代表,第二位“1”格式为31,第三位“7”格式为37,第四位“5”格式为35,第五位“4”...