几种常见的控制器
Spring MVC的核心就是控制器,而在我们写控制器的时候,Spring MVC有那么多的控制器,我们选用哪一个才是最佳选择呢?
Spring MVC 的控制器主要都直接或间接的实现了Controller 接口。主要有以下几类控制器。
1.简单控制器(AbstractController),适合于无参数或者少参数的访问,如我们要一子显示所有留言,显示所有帖子等。在使用该控制器的时候,一般会重写handleRequestInternal方法。
2.命令控制器(AbstractCommandController),自我感觉可以用简单控制器替换,适合于更少参数的传递访问。如:显示我喜欢的帖子。。。。。
3.表单控制器(SimpleFormController)这个控制器是最通用的一个控制器,主要用于对表单的操作和控制。例如:增加,修改帖子等。
4.向导控制器(AbstractWizardFormController)适用于分步注册,分步保存数据的情况下。该控制器里面有很多方法供选择。
5.多动作控制器(multiActionController),该控制器允许在同一个类中写多个不同的方法,以参数的来区别访问哪一个方法。在这个控制器类中可以定义自己
一:解决控制器类中写多个普通方法分别处理(避免重复配置)
- 继承MultiActionController。实现以方法为单位的请求方式。
- 这里有两种配置。分别是根据参数名指定要请求的方法和根据方法名请求controller。
- 分别是:
- 1、ParameterMethodNameResolver 根据参数名
- 2、InternalPathMethodNameResolver 根据方法名
- 案例代码如下。
- 1、 org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver根据参数名的值指定要请求的方法
- 请求的url:
- http://localhost:8080/springmvc/to_add.do?func=to_add
- 注意的地方:
- 1、 类必须继承MultiActionController
- 2、 被请求的方法一定要传递request和response的参数
- public class MultiAction extends MultiActionController{
- public void to_add(HttpServletRequest request,HttpServletResponse reponse){
- System.out.println("to_add"+"--------");
- }
- public void to_delete(HttpServletRequest request,HttpServletResponse reponse){
- System.out.println("to_delete"+"--------");
- }
- }
- 在配置上:
- 首先方法to_add.do就会通过下面的prop配置跳转到相应的controllerbean
- 然后指定参数func是因为:
- <property name="methodNameResolver">
- <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
- <property name="paramName" value="func"></property>
- </bean>
- </property>
- 这里的func指定了要访问的方法名
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/login.do">login</prop>
- <prop key="/to_add.do">multi</prop>
- <prop key="/to_delete.do">multi</prop>
- </props>
- </property>
- </bean>
- <bean id="multi" class="cn.zhang.mvc.MultiAction">
- <property name="methodNameResolver">
- <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
- <property name="paramName" value="func"></property>
- </bean>
- </property>
- </bean>
- 2、
- org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver
- 而另外一种org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver则更加假单。配置:
- 它和上一个org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver相比就简单很多。它直接在url指定方法名就可以比如:
- http://localhost:8080/springmvc/to_delete.do 这个就是说要访问to_delete.do映射到的multiActionContoller中的to_delete方法
- <bean id="multi" class="cn.zhang.mvc.MultiAction">
- <property name="methodNameResolver">
- <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
- </bean>
- </property>
- </bean>
- 第二种方法:通过注解实现(实现一个类中多个普通方法,通过注解路径进行匹配)
- ①首先web.xml配置不变(仅是配置springmvc前端控制器)
- ②在springmvc.xml配置文件中:(疑问:2,3,4步骤不写也可)
- <!-- 1.自动扫描路径下的所有文件,并根据注解完成注入的工作 -->
<context:component-scan base-package="SpringmvcTest2,com.rent.action"/>
<!-- 2.默认的注解映射的支持 -->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!-- 3.启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- 4.使spring支持注解 -->
<context:annotation-config/>
<!--5.可省略 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean> - ③在spring.xml文件中:注入mybatis数据源即可。对于springioc的对象注入使用注解方式
- <!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/pem"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 给mybatis注入数据源 并创建对应对象 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:ConfigLocation.xml"/>
</bean>
<!--创建数据操作对象 -->
<bean id="sqlTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory"
ref="sqlSessionFactory"/>
</bean>
-
@RequestMapping("/rent")
public class RentAction{
@Autowired
private RentService rservice;
@RequestMapping("/doLogin")
public ModelAndView doLogin(String username, String password) {
System.out.println(username+":"+password);
UserPO userPO = new UserPO();
userPO.setUser(username);
userPO.setPass(password);
System.out.println(rservice);
System.out.println(userPO+ userPO.getUser()+ userPO.getPass());
String result = rservice.login(userPO);
Map<String, Object> map = new HashMap<String, Object>();
if("success".equals(result)){
map.put("message",username);
return new ModelAndView("home",map);
}
return new ModelAndView("login",map);
}
public class RentService {
@Autowired
private RentDao rentDao;
public String login(UserPO userPO) {
return rentDao.login(userPO);
}
public class RentDao {
@Autowired
private SqlSessionTemplate sqlTemplate;
public String login(UserPO userPO) {
String result = "";
UserPO user = sqlTemplate.selectOne("rent.login", userPO);
if(user != null){
result="success";
}else{
result="fail";
}
return result;
}
在spring 2.5以上,我们引入组件自动扫描机制,它可以在classpath下寻找标注了@Service,@Repository,@Autowired,@Component注解的类,并把他们放入到spring的容器中管理,他的作用和在xml中使用bean节点配置组件一样,
使用自动扫描机制,需要配置<context:component-scan base-package="com.jadyer"/> ,启动自动扫描其中base-package指定需要扫描的包,它会扫描指定包中的类和子包里面类
@Service用于标注业务层组件
@Repository用于标注数据访问组件,即DAO组件
@Controller用于标注控制层组件,如Struts中的Action
@Component泛指组件,当组件不要好归类时,可以使用这个注解进行标注