使用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
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
相关文章推荐
- 使用网络目录映射虚拟目录出现 500.19 权限不足问题的一个解决办法
- ORACEL中使用IMP出现的表空间不一致的问题暂时解决办法
- VM中使用svn检出代码出现Password for '(null)' GNOME keyring问题的解决办法
- 使用SourceOffSite时出现的问题及解决办法
- 使用 eclipse时,出现如下问题:org.eclipse.swt.SWTError: No more handles的解决办法
- python2.6使用mysql包出现的一些问题以及解决办法
- 转:XP下使用IIS访问asp出现无权查看网页问题的解决办法
- 使用WebView加载数据出现找不到网页的问题之解决办法(转)
- 使用JCMS2.5.7版本预览出现问题的解决办法。
- Eclipse RCP 中使用UTF8编码出现乱码问题的解决办法
- Linux下 android SDK安装及使用时出现的几个问题解决办法(我遇到的)
- 使用hibernate心得——字符串超长的解决办法(setCharacterStream出现顺序问题)
- SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法
- 使用gdiplus.lib出现的一些问题解决办法(不断增加中。。。)
- Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
- 在XP下使用putty连接虚拟机中的linux出现主机拒绝的问题解决办法
- ubuntu下面出现无法使用刚安装eclipse的插件的问题,解决办法
- 使用Mingw在Windows下编译出现的问题以及解决办法
- ElasticSearch使用jdbc-river同步数据库出现dateOptionalTime不能识别的问题解决办法一则
- eclipse使用SVN1.8出现javaHL问题的解决办法