3、 減小Controler對(duì)頁(yè)面地址的依賴
在上面的Controler中,return new ModelAndView("WEB-INF/jsp/hello.jsp", "now", now);指出了jsp頁(yè)面的絕對(duì)路徑,這可以改變。
首先在springapp-servlet.xml中增加一個(gè)bean定義:
<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>/WEB-INF/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
然后把Controler的返回寫為:
return new ModelAndView("hello", "now", now);
這樣InternalResourceViewResolver在返回頁(yè)面之前,會(huì)自動(dòng)加上prefix和suffix。
(。。。我不清楚這有什么用,如果我的路徑除了/WEB-INF/jsp之外還有多個(gè),那該怎么加呢?。。??磥?lái)只好都放到j(luò)sp下面了)
4、 bean定義中把其屬性定義成其他的bean
在springapp-servlet.xml中,我們做出如下定義
<beans>
<bean id="springappController" class="web.SpringappController">
<property name="productManager">
<ref bean="prodMan"/>
</property>
</bean>
<bean id="prodMan" class="bus.ProductManager">
<property name="products">
<list>
<ref bean="product1"/>
<ref bean="product2"/>
<ref bean="product3"/>
</list>
</property>
</bean>
<bean id="product1" class="bus.Product">
<property name="description"><value>Lamp</value></property>
<property name="price"><value>5.75</value></property>
</bean>
<bean id="product2" class="bus.Product">
<property name="description"><value>Table</value></property>
<property name="price"><value>75.25</value></property>
</bean>
<bean id="product3" class="bus.Product">
<property name="description"><value>Chair</value></property>
<property name="price"><value>22.79</value></property>
</bean>
</beans>
有2點(diǎn)需要理解的:
1、 可以直接利用<property name="price"><value>75.25</value></property>為bean的屬性賦值,也可以用<property name="productManager"> <ref bean="prodMan"/> </property>將屬性賦為另一個(gè)定義的bean。
2、 這些被定義為屬性的bean是在Web Module被加載時(shí)同時(shí)被加載的并且賦給屬性的。一旦加載完成,就可以直接使用,因此沒(méi)有必要在Class定義中為這些屬性賦值(但必須有這些屬性的setter定義)。比如按照上面的XML定義,我們把SpringappController寫成這樣:
public class SpringappController implements Controller {
private ProductManager prodMan;
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map myModel = new HashMap();
myModel.put("products", getProductManager().getProducts());
return new ModelAndView("hello", "model", myModel);
}
public void setProductManager(ProductManager pm) {
prodMan = pm;
}
public ProductManager getProductManager() {
return prodMan;
}
}
可以看到,沒(méi)有為屬性private ProductManager prodMan賦值,但定義了它的setter――setProductManager,這個(gè)setter在<bean id="springappController">被加載的時(shí)候自動(dòng)調(diào)用了,以給prodMan賦上值。
5、 單元測(cè)試
在WEB應(yīng)用開(kāi)發(fā)中,我們習(xí)慣的測(cè)試方法是實(shí)際測(cè)試,即把WEB Module部署好了之后,用測(cè)試用例測(cè)試。這樣效率很低,因?yàn)榫幾g、打包、部署、測(cè)試的過(guò)程很費(fèi)時(shí)間。
Spring的思想是及早測(cè)試以發(fā)現(xiàn)問(wèn)題。
例子中,為測(cè)試SpringappController編寫了測(cè)試程序:
package tests;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import web.SpringappController;
import bus.ProductManager;
import bus.Product;
public class TestSpringappController extends TestCase {
private ApplicationContext ac;
public void setUp() throws IOException {
ac = new FileSystemXmlApplicationContext("src/tests/WEB-INF/springapp-servlet.xml");
}
public void testHandleRequest() throws ServletException, IOException {
SpringappController sc = (SpringappController) ac.getBean("springappController");
ModelAndView mav = sc.handleRequest((HttpServletRequest) null, (HttpServletResponse) null);
Map m = mav.getModel();
List pl = (List) ((Map) m.get("model")).get("products");
Product p1 = (Product) pl.get(0);
assertEquals("Lamp", p1.getDescription());
Product p2 = (Product) pl.get(1);
assertEquals("Table", p2.getDescription());
Product p3 = (Product) pl.get(2);
assertEquals("Chair", p3.getDescription());
}
}
測(cè)試類繼承自junit.framework.TestCase。測(cè)試的時(shí)候,主要是測(cè)試controler產(chǎn)生的model對(duì)不對(duì)。當(dāng)然在上面的例子中,測(cè)試沒(méi)有多大的意義,因?yàn)閙odel的產(chǎn)生太簡(jiǎn)單了。但是如果model產(chǎn)生的邏輯非常復(fù)雜,那這種測(cè)試是非常有意義的。
注意上面例子中的
public void setUp() throws IOException {
ac = new FileSystemXmlApplicationContext ( "src/tests/WEB-INF/springapp-servlet.xml" );
}
它為controler創(chuàng)建了一個(gè)類似于app server的環(huán)境(bean的加載就是在這里完成的)
聯(lián)系客服