(1)
创建一个HelloBean.java
package onlyfun.caterpillar;
public class HelloBean
{
private String helloWord = "Hello!World!";
public void setHelloWord(String helloWord)
{
this.helloWord = helloWord;
}
public String getHelloWord()
{
return helloWord;
}
}
(2)
创建一个bean.xml,注意id,class要小写.
<beans>
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
<property name="helloWord"><value>hello jason</value></property>
</bean>
</beans>
(3)
创建一个SpringTest.java
package onlyfun.caterpillar;
import org.springframework.core.io.ClassPathResource;
import java.io.*;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
public class SpringTest
{
public static void main(String[] args) throws IOException
{
ClassPathResource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
HelloBean hello = (HelloBean) factory.getBean("helloBean");
//getBean("helloBean")与bean.xml里的id相互对应
System.out.println(hello.getHelloWord());
}
}
================================实例二==========================================
(1)
package springtest;
public class UserBean {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " [url]http://www.springframework.org/dtd/spring-beans.dtd[/url]">
<beans>
<bean id="userBean" name="userBean" class="springtest.UserBean"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default" >
<property name="name">
<value>bea</value>
</property>
</bean>
</beans>
(3)
测试类:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springtest.UserBean;
public class TestUserBean {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
UserBean bean = (UserBean) ctx.getBean("userBean");
System.out.println(bean.getName());
}
}
=================================================================================
(1)
spring的好处:
可以动态注入bean值,不用编程赋值,用XML配置文件就可以解决一切赋值语句.
(2)
如何配置好log4j.properties
2.1
spring的框架中,已经包含了log4j.所以,log4j默认的配置文件放于src/log4j.properties.
如果在src/中没有文件log4j.properties,则系统会提示:
log4j:WARN No appenders could be found for logger
(org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
-->只须在src目录下,创建,配置log4j.properties即不会出错了.
-->若要在spring的代码中使用log4j,还必须获取log4j的记录器:
static Logger logger=Logger.getLogger(xxx.class.getName());
logger.debug/info/warn/error
******************************************************************
(1)
在Spring的Web MVC框架中,担任前端控制器角色的是org.springframework.web.servlet.DispatcherServlet, DispatcherServlet负责将客户的请求分派给对应于请求的控制物件(controller).
使用Spring Web MVC的第一步,就是在web.xml中定义 DispatcherServlet,如下:
web.xml:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
1.1
其中:
"contextConfigLocation"初始参数用来设定Bean定义档的位置与名称,如果不设置 "contextConfigLocation"初始参数,则DispatcherServlet预设会使用Servlet的名称为前置,读取 “Servlet名称- servlet.xml”作为其Bean定义档.
1.2
您也可以定义多个Bean定义档的来源,像是:
...
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/mvc-config.xml,/WEB-INF/other-service.xml
</param-value>
</init-param>
</servlet>
(2)
DispatcherServlet负责转发请求至控制物件(Controller),在Spring Web MVC框架中,控制物件是org.springframework.web.servlet.mvc.Controller接口的实例.此接口如下:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
2.1
当Controller收到DispatcherServlet转发而来的请求,会执行handleRequest()方法来处理请求,处理完毕后返回一个org.springframework.web.servlet.ModelAndView的实例.如下:
HelloController.java:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
public class HelloController implements Controller {
private String viewPage;
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res)
throws Exception {
String user = req.getParameter("user");
return new ModelAndView(viewPage, "user", user);
}
public void setViewPage(String viewPage) {
this.viewPage = viewPage;
}
}
在这个Controller中,取得了来自使用者从第一个页面传来的user请求参数,并设定在ModelAndView的实例中.
建构 ModelAndView的第一个引数为要呈现的目标网页(或资源)路径,第二个引数是设定用来取得Model物件的键(Key),而第三个引数为要给 View层传递资料用的Model物件。
(3)
依web.xml中的设定,请在WEB-INF目录下建立mvc-config.xml档案:
mvc-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING/DTD BEAN/EN"
" [url]http://www.springframework.org/dtd/spring-beans.dtd[/url]">
<beans>
<bean name="/hello.do" class="webDemo.HelloController">
<property name="viewPage">
<value>hello</value>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value></value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
3.1
实际上DispatcherServlet必须根据一个HandlerMapping物件来决定请求由哪一个Controller来处理, DispatcherServlet预设根据 Bean在定义时的"name"属性及使用者请求的URL来决定使用哪一个Controller实例,例如在这个例子中,请求/hello.do时, DispatcherServlet根据"hello"(即不包括.do)名称决定要使用"name"为"hello"的Bean实例,所以就是将请求交由HelloController的实例来处理。
3.2
当Controller返回ModelAndView后,DispatcherServlet会交由ViewResolver类来作View层的相关解析.
InternalResourceViewResolver的"prefix"、"suffix"属性会与ModelAndView返回的路径资讯结合.例如若路径资讯返回为"hello"字串,则与以上的例子设定结合,实际的路径就是hello.jsp.如果设定如下:
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
则其实际路径将为:
/WEB-INF/jsp/hello.jsp。
(4)
最后新建两个JSP文件:
index.jsp
<body>
<form method="post" action="hello.do">
请输入你的登录名:<input type="text" name="user"><br>
<input type="submit" name="提交">
</form>
</body>
hello.jsp:
<body>
Hello,welcome here ${user} !! <br>
This is your first spring web sample.
</body>
在hello.jsp中,用Expression Language来取得资料,依以上所撰写的程式,如果您在请求hello.do时附带了user参数,则最后的JSP会出现您所给的user讯息。
(5)
总结spring web mvc的工作流程: (负责此流程的对象:dispatcherServlet+其配置文件)
5.1
一个JSP页面提交*.do
5.2
到web.xml中的diapatcherServlet进行判断处理
5.3
dispatcherServlet会根据自己的初始化文件contextConfigLocation中的<bean name="">进行名称对照,获取名称相同的,便可获取其class=""路径
5.4
来到相应的controller中,执行方法handlerRequest(),返回一个ModelAndView的实例
5.5
再返回到dispatcherServlet的初始配置文件,利用其中的bean-->viewResolver的属性进行解析,处理,最终生成要跳转的路径及目标文件,如:/WEB-INF/jsp/hello.jsp.
5.6
跳转到/WEB-INF/jsp/hello.jsp,利用${user}(EL语言),将controller中的某些参数显示出来.
-->理解好spring的动态注入:
即把bean中的值,放置在其配置文件中(如:mvc-config.xml).
可以轻易地被维护.
普通的spring与web spring的区别:
1.
对于bean:
除了属性,getter,setter外,web spring还要继承Controller,实现方法public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse resp) throw Exception.
2.
对于配置文件:
除了定义bean的属性,位置外,web spring还要定义viewResolver,已实现页面的跳转.
3.
对于普通的spring,在调用时,须用
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
==>
无论是在struts,hibernate,spring,jsf其配置文件的作用-->配置了跳转的全过程-->起核心控制
本文出自 “Changes we need ! ” 博客,转载请与作者联系!