您的位置:首页 > 编程语言 > Java开发

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

2017-03-07 10:32 309 查看
几种常见的控制器

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

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

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

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

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

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

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


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

第一种方法:继承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>

控制器类的写法
@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐