首先,弄清楚springmvc跟struts使用的时候有哪些地方会有区别:
(一)从引入开始,struts2在web.xml中使用过滤器 (org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)
而 springmvc采用 Servlet引入 org.springframework.web.servlet.DispatcherServlet
<!-- spring mvc servlet -->
<servlet>
<description>spring mvc servlet</description>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>spring mvc 配置文件</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
(二)请求过来之后的mapping,struts采用配置文件,action method等
这里的springmvc,最方便的写法还是 注解,比如
spring-mvc.xml
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="net.jeeshop" />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
在普通的action上面加上
@Scope("prototype")
@Controller("frontProductAction")
@RequestMapping("/product")
(三)处理完请求,返回视图
struts配置在 result,然后对应到jsp页面,为了最小程度的改动代码,并且也是用jsp视图
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/" p:suffix=".jsp" />
然后action中对返回的String视图,定义成一个变量,然后将每个方法的返回String改为对应的变量名,去掉引号。
这一步可以使用 getPage.pl (专门从 struts的配置文件中转化出对应的 jsp路径,然后转变成springmvc的action中的上述赋值语句)
具体示例请参考下述步骤。
(四)最费时间的部分:
修改jsp页面里面的 struts标签,改为JSTL标签或者 springmvc标签。这里如果作者一开始使用JSTL标签的话,那么基本就不用修改了,
实际操作过程中,这一步耗费时间最多。。。 有点小的感悟就是,用标准化的东西还是有好处,在换其他的框架时不用改动,当然struts标签也有它的优势,
所以也是要综合考虑的。
详细步骤(已忽略配置文件部分):
【1】公共处理:
1.baseAction里面 实现的接口 ActionSuppoer,需要去掉,因为它是Struts的,为了保证代码最小改动,我寻找了 springmvc中获取 request response的方法,
(当然常规做法是在方法的参数里面直接写上request就可以使用了),模拟写了一个 springmcActionContext,继承SpringmvcContextHolder,实现了getRequest、
getResponse方法等等。 但实际上这个做法最后可以忽略了,因为找到了 springmvc的一个有用注解,可以在每个方法调用前执行一段代码【当然就可以在这一段
执行的时候,把参数request response 甚至 <T> e 注入到 BaseAction中,然后其他子类Action即可直接使用已赋值的变量了! 】
protected Model model;
/*************
* 获取request response
*/
protected HttpServletRequest request;
protected HttpServletResponse response;
@ModelAttribute
public void setReqAndRes(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute("e") E e,String[] ids,Model model) {
this.e = e; // 将request中的对象放入action,模拟struts2 属性对象的自动封装
this.request = request;
this.response = response;
this.model = model;
this.ids = ids;
model.addAttribute("e", e);
logger.error("BaseAction:method called before:request="+request+",response="+response
+",e="+JSON.toJSONString(e));
}
特别注意!这里的 model.addAttribute("e", e); 是把变量加入到 输出视图中,如果e的引用没有发生变化,则不需要重新加入一次,
如果 涉及到修改引用地址,则需要重新加入一次了!比如 e = 从数据库重新查出来的一个值,这时候,如果不重新加入,则返回视图获取不到!
2.BaseAction中 去掉 getRequest getResponse方法等
因为子类action中 getRequest()要替换为 request ;getResponse()替换为 response。这两个对象都可直接取自 BaseAction属性。
3.BaseAction中 需要被子类继承了的方法 需要加上 requestmapping 注解,这样有些被子类重写的方法就不需要重复加 mapping路径了
【2】子模块处理部分
-------------------------------------- java action 部分-------------------------------------
1. 先给action加上三个注解
@Scope("prototype")
@Controller
@RequestMapping("/manage/user")
@ModelAttribute
public void initStrutsActionParam(){
this.server = null ; // null这个地方替换成当前action注入的service
}
找到struts的配置文件
所有视图返回的地方,转换成 “视图赋值语句”,调用getPage.pl
2.
因为在baseaction中写好了直接获取requet response的方法【protected】
替换所有的getRequest() 为 request
替换所有的 getResponse() 为 response
3.所有“需要”的方法加上 @requestMapping
4.找到spring的配置文件,配置action的地方,如果是注入的service bean,则在action中将其改为 autowired注解,并将setter getter删掉
然后其他属性,就是非注入的,先注释掉,然后看哪些方法报错,将报错的方法中,选择public的方法[因为私有方法的变量不需要传到视图层]
① 先在方法声明中加上”Model model“ 然后方法体中加入 model.addAttribute(....); 这样表示将这个属性返回到视图[因为之前这些属性
直接在action中定义,struts2就能够传递到视图层了]
5. 注意这个方法
@Override
protected void selectListAfter() {
pager.setPagerUrl(getBasePath() + "manage/?/selectList.action");
}
##### 6.拷贝这个方法: 这一步不需要了
public String selectList() throws Exception {
return super.selectList();
}
----------------------------- page页面部分:所有struts标签 替换成jstl或者spring 标签-------------------------------------
在 common.jsp中加入以下语句
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="ctx" value="<%=request.getContextPath()%>"/>
<input type="hidden" id="namespace" value="${ctx}" /> 当然这里的namespace 跟 struts2的不一样,只是我这里取了一个名称而已。
5-0 a标签
<a href="${ctx}/manage/user/toAdd.action" method="toAdd" class="btn btn-success">
<i class="icon-plus-sign icon-white"></i> 添加
</a>
button标签
<button method="${ctx}/manage/user/selectList.action" class="btn btn-primary" onclick="selectList(this)">
<i class="icon-search icon-white"></i> 查询
</button>
<button method="${ctx}/manage/user/update.action"
class="btn btn-success">
<i class="icon-ok icon-white"></i> 保存
</button>
5-1 s:if s:else 标签
<c:choose>
<c:when test="${role.id == ''}">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${e.id=='' or e.id==null}">
<input type="submit" value="新增" method="insert" onclick="return onSubmit();" class="btn btn-primary" />
</c:when>
<c:otherwise>
<input type="submit" value="保存" method="update" onclick="return onSubmit();" class="btn btn-primary"/>
</c:otherwise>
</c:choose>
【<input type="text" name="role_name" id="role_name" /> <input type="text" name="role_name" id="role_name" readonly="readonly"/>】
5-2 select标签
5-2-1 数据从数据库查询的
<select id="" name="">
<c:forEach items="${roleList}" var="role">
<option value="${role.id}" <c:if test='${role.id == e.rid}'>selected='selected'</c:if> >${role.role_name}</option>
</c:forEach>
</select>
5-2-2 数据直接写死的
<select id="status" name="status" class="input-small">
<option value='0'></option>
<option value='1' <c:if test='${e.status=="y"}'>selected='selected'</c:if>>启用</option>
<option value='2' <c:if test='${e.status=="n"}'>selected='selected'</c:if>>禁用</option>
</select>
5-3 列表循环
<c:forEach items="${pager.list}" var="user">
<tr>
</tr>
</c:forEach>
<input type="hidden" name="id" label="id" value="${e.id}" />
============================================
未完成任务:
1.解决键值对 也有可能有其他的,需要唯一判断的地方,增加键 编辑的时候需要 唯一性验证。否则数据库报错
2.解决键值对编辑的时候,value字段不能够搜索的情况,mybatis bug
3.解决 系统设置功能模块, 并且保存完毕,之后不能继续保存的bug
4.解决定时调度的错误
Exception in thread "pool-2-thread-1" Exception in thread "pool-2-thread-3" java.lang.NullPointerException
at org.slf4j.impl.Log4jLoggerAdapter.error(Log4jLoggerAdapter.java:497)
at net.jeeshop.core.task.CancelOrderTask.run(CancelOrderTask.java:40)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
at org.slf4j.impl.Log4jLoggerAdapter.error(Log4jLoggerAdapter.java:497)
at net.jeeshop.core.task.ManageCacheTask.run(ManageCacheTask.java:36)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Exception in thread "pool-2-thread-2" java.lang.NullPointerException
at org.slf4j.impl.Log4jLoggerAdapter.error(Log4jLoggerAdapter.java:497)
at net.jeeshop.core.task.SystemAutoNotifyTask.run(SystemAutoNotifyTask.java:47)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
2014-08-26 20:25:59 net.jeeshop.core.task.SystemAutoNotifyTask:47 ERROR - OrderCancelTask.run...
=================================================================================
经验:springmvc 加上 urlrewrite之后,/A/A.action 经常出问题,所以最好改为 /A/B.action
否则会下面这种错误:
No matching handler method found for servlet request: path '/product/product.action', method 'GET', parameters map[[empty]]
而不是这种错误:
No mapping found for HTTP request with URI [/jeeshop/product/product1.action] 【这种才是正常的错误】
=======================================================================================
jstl 判断list 是否为空,不能这样写
<c:when test="${requestScope.commentPager.list==null or
requestScope.commentPager.list.size == 0 }">
而应该这样写:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<c:if test="${fn:length(list) <= 0}">
list对象为空
</c:if>
======================================================================================
java.lang.ArithmeticException: / by zero 发生这种错误是因为一个数除以0的情况,0是不能作为被除数的
======================================================================================================
严重: Servlet.service() for servlet springMvc threw exception
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'e' on field 'catalogID': rejected value []; codes [typeMismatch.e.catalogID,typeMismatch.catalogID,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [e.catalogID,catalogID]; arguments []; default message [catalogID]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'catalogID'; nested exception is java.lang.NumberFormatException: For input string: ""]
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:810)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:153)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at net.jeeshop.core.filter.EncodeFilter.doFilter(EncodeFilter.java:22) <============= 每次都在这里
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
..............................
相关推荐
【jeeshop_springmvc】是一个基于Spring MVC框架的开源电商系统,专为中小型企业设计,旨在提供一个高效、易用、可扩展的在线购物平台解决方案。Spring MVC是Spring框架的一部分,它允许开发者构建高性能、灵活的Web...
### 电商项目SSM框架关键知识点解析 #### 一、电商项目背景与挑战 随着互联网技术的迅猛发展,电子商务已成为现代商业活动中不可或缺的一部分。自20世纪90年代以来,互联网经历了翻天覆地的变化,从最初的Web服务...
综上所述,这个项目利用了ZK作为前端框架,SpringMVC处理后端业务逻辑,Maven负责项目构建与依赖管理,log4j2与SLF4J进行日志记录,而Durid则作为高效的数据库连接池。整个系统设计考虑了开发效率、日志记录、数据库...
该套视频为2016年最新教程,高清无码!!!将目前主流电商项目中使用的技术集成到该项目中。值得学习的一个好项目,本人是培训学校出来的。
《电商项目:Spring+SpringMVC+MyBatis+MySQL技术深度解析》 在现代互联网行业中,电商项目占据了举足轻重的地位。本项目采用了一套成熟的技术栈,包括Spring、SpringMVC、MyBatis以及MySQL,这些技术在企业级应用...
Javashop B2C是国内一款java开源电商系统,采用EOP(Enation Open Platform易族开放平台)框架体系,致力给客户提供稳定、高效的电商系统。 Javashop是基于Java技术构建的开源电子商务平台,采用EOP(Enation Open ...
"Spring+SpringMVC+Mybatis框架项目整合"是一个典型的后端技术栈,旨在提供高效、灵活且可维护的解决方案。下面将详细介绍这三个框架及其整合过程中的关键知识点。 **Spring框架**: Spring是一个开源的Java平台,...
这是一个网上书城项目,采用当前最流行的框架Spring-SpringMVC-MyBatis设计,主要是对之前用Jsp/Servlet做的一些优化,重构了整个系统,感觉还不错,学到了很多新的知识,能对SSM框架熟练的运用了。 这是一个网上...
【标题】"基于LayUI+SpringMVC的快速开发框架源码.zip...综上所述,这个基于LayUI+SpringMVC的快速开发框架源码涵盖了前端UI设计、后端业务逻辑处理、数据库交互等多个方面,为开发者提供了便捷的Web应用开发解决方案。
SSM项目-电商项目是一个基于经典的SSM(Spring、SpringMVC、MyBatis)框架构建的电子商务系统。这个项目采用的技术栈不仅限于SSM,还包括MySql数据库和MyEclipse开发工具,旨在提供一个全面的、实际操作的电商平台...
标题《Java开源电商系统BroadLeaf文档》所揭示的关键知识点如下: 1. BroadLeaf Commerce是一个国外开源的Java电子商务平台,它的开发基于Spring框架,这表明了它具有良好的轻量级依赖注入和面向切面编程(AOP)的...
SpringMVC4.0以后,Spring开始使用Spring Boot来支持自动化开发和部署,虽然方便了程序员和运维,但是也让老的架构开发人员感到困惑。 所以,作者做了一下研究尝试将新的Spring Boot的web项目,转换成旧项目模式,...
水果电商系统采用SSM(Spring+SpringMVC+MyBatis)框架结合MySQL数据库进行开发,主要实现了前后台的多项功能,以满足用户购买水果和管理员管理系统的需求。以下是对该系统功能的详细描述: 一、前台功能 水果展示...
这个基于SSM框架的完整项目是一个采用Spring管理控制层,SpringMVC处理请求和视图,Mybatis作为持久层操作数据库的后台管理系统。项目还引入了前端Bootstrap框架,以实现响应式网页设计,提高用户体验。 首先,...
在这个"SpringMvc+mybatis框架结合的一个练习项目"中,开发者利用 SpringMvc 处理 Web 请求,通过 Mybatis 进行数据操作。项目包含了论坛和聊天系统,这涉及到用户认证、消息传递、数据存储等多个方面,充分展示了这...
1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...
服务端项目(Java)一个基于Spring,SpringMVC,Mybatis 构建的电商平台,涵盖后台系统和门户页面,是SSM实战的很好实践。运用到了常用的互联网技术,比如redis,jwt,等等 服务端项目(Java)一个基于Spring,...
《SpringMVC+Spring+Mybatis在校园O2O...通过SpringMVC+Spring+Mybatis的组合,这个校园O2O电商项目的后台和管理平台能够高效、稳定地运行,为用户提供顺畅的购物体验,同时也为开发者提供了一个良好、规范的开发环境。
该项目是一个使用SSM(Spring、SpringMVC和Mybatis)框架构建的电商小应用程序,它利用Maven作为项目管理工具,并且依赖于MySQL数据库来存储数据。以下是对这些技术及其在项目中的应用的详细说明: **Spring框架**...
SSM框架,全称为Spring、SpringMVC和MyBatis的组合,是Java后端开发中常见的企业级应用框架。Spring作为一个全面的轻量级容器,负责管理对象的生命周期和依赖注入;SpringMVC作为Spring的Web模块,处理HTTP请求和...