SpringMVC 入门知识
一、SpringMVC入门介绍
springMVC代替struts2去整合hibernate实现功能的框架。使用springMVC有两个配置文件需要配置,一 个是applicationContext.xml、另一个是web.xml,在applicationContext.xml里面配置事务管理器以及属性注入等。web.xml里面要添加一个springMVC的servlet的注册和映射(DispatcherServlet),这个servlet是 springMVC的核心控制器,专门处理各个请求的,然后根据相应的参数分发给相应的业务控制器处理,业务控制器处理完之后就会返回一字符串给核心控制 器,核心控制器再根据该字符串重定向或者转发到相应的页面。还必须给该核心控制器建一个配置文件,其形式为:核心控制器servlet名-servlet.xml,如springMVC-servlet.xml.该配置文件放在WEB-INF下面。
HandlerMapping接口 -- 处理请求的映射。由于HandlerMapping接口的实现类有两种方式:
SimpleUrlHandlerMapping ——通过配置文件,把一个URL映射到Controller;
DefaultAnnotationHandlerMapping ——通过注解,把一个URL映射到Controller类上
所以,springMVC的实现由两种方式:配置文件和注解两种方式。
springMVC与struts2的区别:
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。
2. 性能:spring会稍微比struts快。spring
mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个 action都会被注入属性,而spring基于方法,
粒度更细,但要小心把握像在servlet控制数据一样。spring3
mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数 据注入进去,在spring3
mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter、getter方法把request中的数据注入;struts2实际上是通过setter
getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
注:下面用到的实例以用户的登录为简单模型来解释。用户的字段有id、loginName、passwd。该小实例提供链接MySQL数据库的注册 和登录的功能。
二、SpringMVC与Hibernate整合
1.搭建环境
导入SSH的jar包和数据库驱动的jar包,即将必须的jar包拷贝到webRoot/WEB-INF/lib文件中,会自动加载到该项目中。
2.搭配spring环境
src目录下自动生成applicationContext.xml的spring配置文件。此外还得再web.xml中配置spring容器实例化的监听器。关键代码如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
注:在这里可以不用配置spring容器实例化的监听器。
3.搭建Hibernate环境
a.搭建的步
骤:Hibernate的配置文件选择spring configuration
file(applicationContext.xml),在选择Existing spring configuration
file,其他默认。接着选择数据库,注意修改当前项目数据库名。接着,create SessionFactory class?勾选掉。
b.搭建成功结果:
在applicationContext.xml文件中生成dataSource的bean和sessionFactory的bean。参考代码如下
<!-- 注入数据源 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/该项目所在数据库名"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 注入SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<!-- 引入映射文件 -->
....(略)
</bean>
4.web.xml文件的配置
springMVC的servlet的注册和映射(DispatcherServlet)。这个servlet是 springMVC的核心控制器,专门处理各个请求的,然后根据 相应的参数分发给相应的业务控制器处理,业务控制器处理完之后就会返回一字符串给核心控制 器,核心控制器再根据该字符串重定向或者 转发到相应的页面。还必须给该核心控制器建一个配置文件,其形式为:核心控制器servlet名-servlet.xml,如springMVC-servlet.xml.该 配置文件放在WEB-INF下面。
<!-- springMVC的servlet的注册和映射(DispatcherServlet) -->
<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/classes/web-config.xml,/WEB-INF/classes/applicationContext.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>
5.SpringMVC的配置文件
SpringMVC的配置文件这里为web-config.xml(和上面DispatcherServlet里的初始化文件名相同)。他的配置代码参考如下:
a.注解方式的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="(基本包如:cn.com)"/>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- Controller方法调用规则定义 -->
<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action"/>
<property name="defaultMethodName" value="list"/>
</bean>
<!-- 页面View层基本信息设定 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
b.配置文件的方式(每种方法必须一个Controller即两个bean):
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- Controller方法调用规则定义 -->
<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action" />
<property name="defaultMethodName" value="list" />
</bean>
<!-- 页面View层基本信息设定 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<!-- <property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"/> -->
</bean>
<!-- servlet映射列表,所有控制层Controller的servlet在这里定义 -->
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="user/regist.do">userRegistController</prop>
<prop key="user/login.do">userLoginController</prop>
</props>
</property>
</bean>
<bean id="userRegistController" class="(包名).UserRegistController">
<property name="userService">
<ref bean="userService" />
</property>
</bean>
<bean id="userLoginController" class="(包名).UserLoginController">
<property name="userService">
<ref bean="userService" />
</property>
</bean>
</beans>
三、SpringMVC两种方法实现登录和注册的功能的映射使用区别
1.注解的方式
@Controller //把当前JavaBean当做Controller
@RequestMapping("/user.do") //给该控制器设定访问URL
public class UserController {
@Resource //注入
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@RequestMapping(params="method=regist")
public String regist(String loginName,String passwd){
User user = new User(loginName, passwd);
if(userService.regist(user)){
return "index";
}else{
return "regist";
}
}
@RequestMapping(params="method=login")
public String login(User user,HttpSession session){
User loginUser = userService.login(user.getLoginName(), user.getPasswd());
if(user!=null){
session.setAttribute("user", loginUser);
//return "success";
return "redirect:success.jsp";
}else{
return "index";
}
}
}
2.配置文件的方式
a.UserLoginController文件
public class UserLoginController implements Controller {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String loginName = request.getParameter("loginName");
String passwd = request.getParameter("passwd");
User user = userService.login(loginName, passwd);
if(user!=null){
request.getSession().setAttribute("user", user);
return new ModelAndView("redirect:/success.jsp");
}else{
return new ModelAndView("redirect:/index.jsp");
}
}
}
b.UserRegistController文件
public class UserRegistController implements Controller {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String loginName = request.getParameter("loginName");
String passwd = request.getParameter("passwd");
User user = new User(loginName, passwd);
if(userService.regist(user)){
// return new ModelAndView("index");
//return new ModelAndView("/index.jsp");//转发
/*
* 有前缀和后缀
* url:prefix+index+suffix == /index.jsp
*
* 没有前缀和后缀
* ModelAndView("URL");
*/
return new ModelAndView("redirect:/index.jsp");//重定向--一般不会使用前缀和后缀
}else{
return new ModelAndView("redirect:/regist.jsp");
}
}
}
四、其他文件的内容及配置
其他都是按MVC框架进行的设计。参考代码,这里不再赘述。参考的工程项目源码见分享链接:http://pan.baidu.com/s/1qW9REPm。