`

结合开源电商jeeshop,修改项目前端框架为springmvc

阅读更多

 

首先,弄清楚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, 开源电商系统jeeshop的springmvc版.zip

    【jeeshop_springmvc】是一个基于Spring MVC框架的开源电商系统,专为中小型企业设计,旨在提供一个高效、易用、可扩展的在线购物平台解决方案。Spring MVC是Spring框架的一部分,它允许开发者构建高性能、灵活的Web...

    电商项目ssm框架

    ### 电商项目SSM框架关键知识点解析 #### 一、电商项目背景与挑战 随着互联网技术的迅猛发展,电子商务已成为现代商业活动中不可或缺的一部分。自20世纪90年代以来,互联网经历了翻天覆地的变化,从最初的Web服务...

    ZK 前端框架 继承 SpringMVC +maven + log4j2 + slf4j + durid 数据库加密

    综上所述,这个项目利用了ZK作为前端框架,SpringMVC处理后端业务逻辑,Maven负责项目构建与依赖管理,log4j2与SLF4J进行日志记录,而Durid则作为高效的数据库连接池。整个系统设计考虑了开发效率、日志记录、数据库...

    2016年大型电商项目(淘淘商城)基于Springmvc+spring+mabatis,含视频和详细笔记

    该套视频为2016年最新教程,高清无码!!!将目前主流电商项目中使用的技术集成到该项目中。值得学习的一个好项目,本人是培训学校出来的。

    电商项目(spring+springMVC+mybatis+mysql)

    《电商项目:Spring+SpringMVC+MyBatis+MySQL技术深度解析》 在现代互联网行业中,电商项目占据了举足轻重的地位。本项目采用了一套成熟的技术栈,包括Spring、SpringMVC、MyBatis以及MySQL,这些技术在企业级应用...

    javashop B2C开源电商系统 v6.3.2

    Javashop B2C是国内一款java开源电商系统,采用EOP(Enation Open Platform易族开放平台)框架体系,致力给客户提供稳定、高效的电商系统。 Javashop是基于Java技术构建的开源电子商务平台,采用EOP(Enation Open ...

    Spring+SpringMVC+Mybatis框架项目整合

    "Spring+SpringMVC+Mybatis框架项目整合"是一个典型的后端技术栈,旨在提供高效、灵活且可维护的解决方案。下面将详细介绍这三个框架及其整合过程中的关键知识点。 **Spring框架**: Spring是一个开源的Java平台,...

    网上书城项目(采用框架Spring-SpringMVC-MyBatis).zip

    这是一个网上书城项目,采用当前最流行的框架Spring-SpringMVC-MyBatis设计,主要是对之前用Jsp/Servlet做的一些优化,重构了整个系统,感觉还不错,学到了很多新的知识,能对SSM框架熟练的运用了。 这是一个网上...

    基于LayUI+SpringMVC的快速开发框架源码.zip

    【标题】"基于LayUI+SpringMVC的快速开发框架源码.zip...综上所述,这个基于LayUI+SpringMVC的快速开发框架源码涵盖了前端UI设计、后端业务逻辑处理、数据库交互等多个方面,为开发者提供了便捷的Web应用开发解决方案。

    ssm项目-电商项目

    SSM项目-电商项目是一个基于经典的SSM(Spring、SpringMVC、MyBatis)框架构建的电子商务系统。这个项目采用的技术栈不仅限于SSM,还包括MySql数据库和MyEclipse开发工具,旨在提供一个全面的、实际操作的电商平台...

    Java开源电商系统BroadLeaf文档

    标题《Java开源电商系统BroadLeaf文档》所揭示的关键知识点如下: 1. BroadLeaf Commerce是一个国外开源的Java电子商务平台,它的开发基于Spring框架,这表明了它具有良好的轻量级依赖注入和面向切面编程(AOP)的...

    SpringBoot项目转传统SpringMVC war项目

    SpringMVC4.0以后,Spring开始使用Spring Boot来支持自动化开发和部署,虽然方便了程序员和运维,但是也让老的架构开发人员感到困惑。 所以,作者做了一下研究尝试将新的Spring Boot的web项目,转换成旧项目模式,...

    水果电商购物系统(Spring+SpringMVC+MyBatis)

    水果电商系统采用SSM(Spring+SpringMVC+MyBatis)框架结合MySQL数据库进行开发,主要实现了前后台的多项功能,以满足用户购买水果和管理员管理系统的需求。以下是对该系统功能的详细描述: 一、前台功能 水果展示...

    基于SSM框架的完整项目 Spring+SpringMVC+Mybatis+mysql+bootstrap下载

    这个基于SSM框架的完整项目是一个采用Spring管理控制层,SpringMVC处理请求和视图,Mybatis作为持久层操作数据库的后台管理系统。项目还引入了前端Bootstrap框架,以实现响应式网页设计,提高用户体验。 首先,...

    SpringMvc+mybatis框架结合的一个练习项目

    在这个"SpringMvc+mybatis框架结合的一个练习项目"中,开发者利用 SpringMvc 处理 Web 请求,通过 Mybatis 进行数据操作。项目包含了论坛和聊天系统,这涉及到用户认证、消息传递、数据存储等多个方面,充分展示了这...

    1、手写springmvc框架及分析springmvc源码.zip

    1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...

    一个基于Spring,SpringMVC,Mybatis 构建的电商平台.zip

    服务端项目(Java)一个基于Spring,SpringMVC,Mybatis 构建的电商平台,涵盖后台系统和门户页面,是SSM实战的很好实践。运用到了常用的互联网技术,比如redis,jwt,等等 服务端项目(Java)一个基于Spring,...

    SpringMVC+spring+Mybatis的校园o2o电商项目的后台和管理平台

    《SpringMVC+Spring+Mybatis在校园O2O...通过SpringMVC+Spring+Mybatis的组合,这个校园O2O电商项目的后台和管理平台能够高效、稳定地运行,为用户提供顺畅的购物体验,同时也为开发者提供了一个良好、规范的开发环境。

    基于SSM(Spring+Springmvc+Mybatis)框架的电商小项目,使用Maven构建项目,MySQL为.zip

    该项目是一个使用SSM(Spring、SpringMVC和Mybatis)框架构建的电商小应用程序,它利用Maven作为项目管理工具,并且依赖于MySQL数据库来存储数据。以下是对这些技术及其在项目中的应用的详细说明: **Spring框架**...

    SSM框架VUE实现B2C电商项目

    SSM框架,全称为Spring、SpringMVC和MyBatis的组合,是Java后端开发中常见的企业级应用框架。Spring作为一个全面的轻量级容器,负责管理对象的生命周期和依赖注入;SpringMVC作为Spring的Web模块,处理HTTP请求和...

Global site tag (gtag.js) - Google Analytics