spring mvc 提供了对web的支持。spring的这种支持使得spring可以像其他web层的框架一样搭建web层应用!
spring mvc 核心技术主要围绕分发器(DispatcherServlet)来实现,它可以将请求分发到不同的处理器,由控制器完成控制分发工作!
实现步骤:
a、添加框架,注意勾选spring3.0 web library
b、在web.xml文件中,注册DispatcherServlet
dispatcherServlet 会默认寻找web-inf 路径下的myServlet-servlet.xml!我们将此路径重定向到spring的配置文件classes/applicationContext.xml!
第一种:(每个action类只能实现一个.do的请求,应为spring的配置文件里面没有指定什么请求进什么方法,一般种不常用)
web.xml的内容配置:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 配置DispatchServlet读取spring配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 通过过滤器设置编码集合 ,防止后台拿前台参数乱码-->
<filter>
<filter-name>springUtf8Encoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springUtf8Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
前台页面index:
<body>
<form method="post" action="login.do">
<p>
用户名:
<input type="text" name="username">
</p>
<p>
密 码:
<input type="password" name="password">
</p>
<p>
<input type="submit" value="提交" name="button1">
</p>
</form>
</body>
spring的配置文件 applicationContext.xml的配置:
<bean name="/login.do" class="com.spring.mvc.UserAction"></bean>
后台Action类的写法:
//实现一个Controller接口
public class UserAction implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("登录成功");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + " " + password);
ModelAndView mv = new ModelAndView("a.jsp", "msg", "登录成功");
return mv ;
}
}
第二种:(springmvc实现多请求进入同一个action)
web.xml 配置:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 配置DispatchServlet读取spring配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 通过过滤器设置编码集合 ,防止后台拿前台参数乱码-->
<filter>
<filter-name>springUtf8Encoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springUtf8Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
前台页面index:
<body>
<a href="login.do?function=A">登录</a>
<a href="login.do?function=B">注册</a>
<a href="login.do?function=C">退出</a>
</body>
spring的配置文件 applicationContext.xml的配置:
<pre name="code" class="html" style="font-size:14px;">
<bean name="/login.do" class="com.spring.mvc.EmpAction">
<!-- 根据function所对应的值查找到类中方法名和该值一致的方法 --> <property name="methodNameResolver"> <ref bean="myMethodName"/> </property> </bean> <!-- 根据url得到function所对应的值 --> <bean name="myMethodName" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName"> <value>function</value> </property>
</bean>
EmpAction类:
<pre name="code" class="java"><pre name="code" class="java"> //继承一个MultiActionController类
public class EmpAction extends MultiActionController {public ModelAndView A(HttpServletRequest request,HttpServletResponse response) throws Exception { System.out.println("登录成功");return null ;}public ModelAndView B(HttpServletRequest request,HttpServletResponse response) throws Exception {System.out.println("注册成功");return null ;}public ModelAndView C(HttpServletRequest request,HttpServletResponse response) throws Exception {System.out.println("退出成功");return null ;} }
知识点:
spring中容器创建对象的方式:
1.默认是调用默认的构造方法
2.利用静态工厂方法来创建(spring调用工厂方法产生对象,但是真正创建对象还是由程序员来完成)
3.实力工厂方法
说明:spring配置文件中,只要是一个bean就会为该bean创建对象
spring容器创建对象的时机(在单例情况下):
1.在默认的情况下,启动spring容器创建对象
2.在spring的配置文件bean中有一个属性lazy-init="default/true/false"
①如果lazy-init="default/false",则在启动spring容器时创建对象
②如果lazy-init="true",则在context.getBean()时创建对象
意义:第一种情况下可以启动spring容器的时候,检查spring容器的排配置文件的正确性,如果再结合tomcat,如果tomcat不能正常启动,则整个spring容器就不能正常启 动。但是这样有一个缺点,把一些bean过早的放到了内存中,如果有数据,则对内存来说是一种消耗。
第二种情况,可以减少内存的消耗,但是不太容易发现问题。
spring的bean中的scope
1.由spring产生的bean默认是单例的
2.可以在spring的配置文件中,scope的值进行修改“singleton/prototype/request/session/global session”
3.如果spring配置文件中的scope为“prototype”,则在得到该bean才创建对象
spring容器对象的生命周期:
1.spring容器创建对象
2.执行init方法
3.调用自己的方法
4.当spring容器关闭的时候执行destroy方法
spring的DI:依赖注入,给属性赋值
springDI的说明:
1.如果spring的配置文件中的bean没有<constructor-arg>该元素,则调用默认的构造函数
2.如果spring的配置文件中的bean有<constructor-arg>该元素,则该元素调用唯一的构造函数
index--->代表参数的位置是从0开始的
type--->代表参数的类型
value--->给基本类型赋值的
ref--->给引用类型赋值的
springIOC和DI的意义:实现了完全的面向接口编程