使用Springmvc出现问题及解决办法

几种常见的控制器

Spring MVC的核心就是控制器,而在我们写控制器的时候,Spring MVC有那么多的控制器,我们选用哪一个才是最佳选择呢?

Spring MVC 的控制器主要都直接或间接的实现了Controller 接口。主要有以下几类控制器。

1.简单控制器(AbstractController),适合于无参数或者少参数的访问,如我们要一子显示所有留言,显示所有帖子等。在使用该控制器的时候,一般会重写handleRequestInternal方法。

2.命令控制器(AbstractCommandController),自我感觉可以用简单控制器替换,适合于更少参数的传递访问。如:显示我喜欢的帖子。。。。。

3.表单控制器(SimpleFormController)这个控制器是最通用的一个控制器,主要用于对表单的操作和控制。例如:增加,修改帖子等。

4.向导控制器(AbstractWizardFormController)适用于分步注册,分步保存数据的情况下。该控制器里面有很多方法供选择。

5.多动作控制器(multiActionController),该控制器允许在同一个类中写多个不同的方法,以参数的来区别访问哪一个方法。在这个控制器类中可以定义自己

一:解决控制器类中写多个普通方法分别处理(避免重复配置)

第一种方法:继承 MultiActionController   
  1.   
  2.   
  3. 继承MultiActionController。实现以方法为单位的请求方式。  
  4. 这里有两种配置。分别是根据参数名指定要请求的方法和根据方法名请求controller。  
  5. 分别是:  
  6. 1、ParameterMethodNameResolver   根据参数名  
  7. 2、InternalPathMethodNameResolver 根据方法名  
  8.   
  9. 案例代码如下。  
  10. 1、  org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver根据参数名的值指定要请求的方法  
  11.   
  12. 请求的url:  
  13. http://localhost:8080/springmvc/to_add.do?func=to_add  
  14.   
  15. 注意的地方:  
  16. 1、  类必须继承MultiActionController  
  17. 2、  被请求的方法一定要传递request和response的参数  
  18.   
  19. public class MultiAction extends MultiActionController{  
  20.       
  21.     public void to_add(HttpServletRequest request,HttpServletResponse reponse){  
  22.         System.out.println("to_add"+"--------");  
  23.     }  
  24.       
  25.       
  26.     public void to_delete(HttpServletRequest request,HttpServletResponse reponse){  
  27.         System.out.println("to_delete"+"--------");  
  28.     }  
  29. }  
  30.   
  31. 在配置上:  
  32.   
  33. 首先方法to_add.do就会通过下面的prop配置跳转到相应的controllerbean  
  34. 然后指定参数func是因为:  
  35.     <property name="methodNameResolver">  
  36.             <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
  37.                 <property name="paramName" value="func"></property>  
  38.             </bean>  
  39.         </property>  
  40. 这里的func指定了要访问的方法名  
  41.   
  42.   
  43.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  44.         <property name="mappings">  
  45.             <props>  
  46.                 <prop key="/login.do">login</prop>  
  47.                 <prop key="/to_add.do">multi</prop>  
  48.                 <prop key="/to_delete.do">multi</prop>  
  49.             </props>  
  50.         </property>  
  51.     </bean>  
  52.   
  53.     <bean id="multi" class="cn.zhang.mvc.MultiAction">  
  54.         <property name="methodNameResolver">  
  55.             <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
  56.                 <property name="paramName" value="func"></property>  
  57.             </bean>  
  58.         </property>  
  59.     </bean>  
  60.   
  61. 2、  
  62. org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver  
  63.   
  64. 而另外一种org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver则更加假单。配置:  
  65.   
  66. 它和上一个org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver相比就简单很多。它直接在url指定方法名就可以比如:  
  67.   
  68. http://localhost:8080/springmvc/to_delete.do   这个就是说要访问to_delete.do映射到的multiActionContoller中的to_delete方法  
  69.   
  70.     <bean id="multi" class="cn.zhang.mvc.MultiAction">  
  71.         <property name="methodNameResolver">  
  72.             <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">  
  73.             </bean>  
  74.         </property>  
  75.     </bean> 
  76. 第二种方法:通过注解实现(实现一个类中多个普通方法,通过注解路径进行匹配) 
  77.   ①首先web.xml配置不变(仅是配置springmvc前端控制器)
  78.   ②在springmvc.xml配置文件中:(疑问:2,3,4步骤不写也可)
  79.   <!-- 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>
  80. ③在spring.xml文件中:注入mybatis数据源即可。对于springioc的对象注入使用注解方式
  81. <!-- 配置数据源 -->
    <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>



控制器类的写法
@Controller
@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);  
  }

service层:
@Service(value="rentService")
public class RentService {

@Autowired
private RentDao rentDao;

public String login(UserPO userPO) {
return rentDao.login(userPO);
}
dao层:
@Component
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泛指组件,当组件不要好归类时,可以使用这个注解进行标注 



jsp页面(用户请求):请求路径
localhost:8080/项目名/rent/doLogin.action

猜你喜欢

转载自blog.csdn.net/happyAliceYu/article/details/60575866
今日推荐