Java Web应用开发项目教程(王俊松第3版) 教案 拓展实践2 estoreSSM开发文档 1 环境和框架搭建-使用mybaits逆向工程改写_第1页
Java Web应用开发项目教程(王俊松第3版) 教案 拓展实践2 estoreSSM开发文档 1 环境和框架搭建-使用mybaits逆向工程改写_第2页
Java Web应用开发项目教程(王俊松第3版) 教案 拓展实践2 estoreSSM开发文档 1 环境和框架搭建-使用mybaits逆向工程改写_第3页
Java Web应用开发项目教程(王俊松第3版) 教案 拓展实践2 estoreSSM开发文档 1 环境和框架搭建-使用mybaits逆向工程改写_第4页
Java Web应用开发项目教程(王俊松第3版) 教案 拓展实践2 estoreSSM开发文档 1 环境和框架搭建-使用mybaits逆向工程改写_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1环境和框架搭建1工程框架搭建1.1创建工程estore-ssm创建web工程,名为estore-ssm,javaee版本选择6.0。1.2加入依赖包为工程加入依赖包,如下:1.3工程src组织结构src组织结构和之前的练习类似,请按照下面的组织结构创建包、文件夹、接口、类和各种配置文件。其中,配置文件可以从之前的项目中拷贝,之后稍加修改即可。cn.estore包下面分5个子包cn.estore包下面分5个子包1.4页面资源组织结构请按照下面组织创建文件夹和文件,其中(1)common中的文件均提供,直接拷贝即可,之后再修改其中的各种链接pages里面放页面,其下分cart、product、customer、order文件夹分别存放相应模块的页面(2)resources提供,直接拷贝即可pages里面放页面,其下分cart、product、customer、order文件夹分别存放相应模块的页面index.jsp系统首页resources里放资源文件,分css,images,js三个文件夹images里面分两个文件夹,一个放商品图片,一个放系统图标common里面放上侧,左侧,下侧的固定页面,以及登录和商品搜索等固定页面index.jsp系统首页resources里放资源文件,分css,images,js三个文件夹images里面分两个文件夹,一个放商品图片,一个放系统图标common里面放上侧,左侧,下侧的固定页面,以及登录和商品搜索等固定页面WEB-INF下面放Spring-mvc的配置文件和web.xmlWEB-INF下面放Spring-mvc的配置文件和web.xml2配置文件2.1applicationContext-dao.xmlDao层的配置文件和之前的极其类似,只需把之前的dao层配置文件拷贝过来修改即可,修改的位置见红线处。扫描的包是cn.estore.dao配置mybatis的mapper接口自动扫描配置mybatis的sqlSeesionfactory配置数据源加载数据库属性文件扫描的包是cn.estore.dao配置mybatis的mapper接口自动扫描配置mybatis的sqlSeesionfactory配置数据源加载数据库属性文件2.2applicationContext-service.xmlService层的配置就是启动service层的组件扫描,如下:2.3applicationContext-tx.xml事务的配置,和之前一样。2.4perties连接的数据库名称要换成estore的数据库名。2.5mybatis-config.xml(1)启动驼峰式命名映射,启动后,表中的字段a_xyz_mn会和实体类中的属性aXyzMn自动匹配,在写sql语句的时候就不用写很多“as别名”了。但是实体类的属性在命名时要小心检查,如果名字取的不对,将无法映射到表字段上,会导致select的结果不对。(2)为domain包的里的类定义别名。Product类的别名为product,Customer类的别名是customer。2.6web.xmlWeb.xml文件中的内容和之前的差异如下:(1)添加了一个welcome-file(2)将servlet的名称改成了estore(3)将servlet处理的url扩展名改成了.do2.7estore-servlet.xml由于servlet的名字为estore,因此springmvc的配置文件名默认为estore-servlet.xml。文件中配置两项:(1)启动web层的组件扫描(2)配置springmvc的视图解析器,前缀、后缀。由于页面都放在pages文件夹下,前缀配成/pages/,后缀是.jsp。2首页和商品搜索1运行效果1.1首页首页显示全部商品,分页。1.2商品搜索按照商品名进行模糊查询,对查询结果分页,下图是根据“鞋”查询的结果。2首页布局系统首页index.jsp(已提供)贴到pages文件夹下。首页采用div布局,页面代码如下。在css的作用下会呈现上、左、中、下的效果。其中的“中部”即id为“content”的div将根据用户不同的操作,动态呈现不同的页面。除了个别情况下的页面整体刷新,绝大部分情况下,页面仅有content–div更换内容。将使用ajax局部刷新技术。例如:用户点击“搜索”时,content-div“显示按商品名进行模糊查询的结果。用户点击“注册”时,content-div“显示注册表单。3显示全部商品和商品搜索的思路(1)首页和商品搜索结果页面均是对查询结果进行显示,因此使用同一个页面showProducts.jsp展示。(2)依靠search参数区分是首页,还是商品搜索,如果search参数是空,则查询所有商品,如果不是空,则是模糊查询。(3)查询所有商品和“搜索”,均先查询count(*),记下页数、总记录数(页面需要显示这些数据,查一次就行了)。然后转发给showProductList方法。(4)showProductList方法,根据页号计算此次查询的起始记录号,进行分页查询。“select*fromtb_productlimita,5”表示查询tb_product表,从第a个记录开始取5条记录。将查询结果组织成list,存储在request中,转发给showProducts.jsp页面显示。(5)showProducts.jsp页面遍历list,显示在页面中。当用户点“上一页”“下一页”时,将新页号提交到showProductList方法,再次查询下一组数据。4动态更新content–div内容的思路所有请求均通过调用js函数来提交,使用ajax从服务器取得数据,设置到div中,参考示例如下:functionshowAllProducts(){ $.ajax({ url:'showAllProducts.do',//查询所有商品 type:'get', success:function(responseText){//responseText里存储的是查询到的所有商品页面 $('#content').html(responseText); //将所有商品页面嵌入divcontent中 } }); }5Product实体类Product实体类和tb_product表对应,注意该类的属性命名,由于启动了mybatis驼峰映射,字段名是a_xyz_mn,属性名必须叫做aXyzMn,写完后请仔细核对。Set和get方法请自行生成。6ProductDao接口ProductDao包含三个方法:(1)根据商品名、起始记录号、记录数进行查询,如果没有商品名,查询所有商品(2)按照商品id,查询商品(3)根据商品名进行查询,返回记录数,如果没有商品名,查询所有商品数量这个映射文件对应的接口7Product.xml这个映射文件对应的接口模糊查询的第二种写法返回从第start个记录开始的limit条记录如果用户名不为空,添加模糊查询条件接口里的方法名模糊查询的第二种写法返回从第start个记录开始的limit条记录如果用户名不为空,添加模糊查询条件接口里的方法名8ProductService接口包含三个方法,和dao里的三个方法对应。9ProductServiceImpl类ProductServiceImpl类实现ProductService接口,注意为其加@Service注解,以及自动注入ProductDao。11ProductController类每页记录数可以自行调整每页记录数可以自行调整将查询中的商品列表存在request中,showProducts页面可以取得。将查询中的商品列表存在request中,showProducts页面可以取得。Base元素可以设置页面中所有相对路径的基准,href中的el表达式表示web应用的根目录。本例中就是/estore-ssm/。Base可以作用在超链接、图片、css链接,js链接,表单提交路径等位置。(jsp中的include,forward等不适用)加上这句后,免去了到处写绝对路径的麻烦。文档中使用相对路径只要相对于应用根目录写就行了,而且不会出现相对路径叠加问题。查询所有商品和商品搜索的请求均进入此方法,先算记录数和总页数转发到showProductList.do,将页数和总记录数传过去,页号为1商品搜索的search表单项传过来,如果为空,则是查询所有商品12index.jsBase元素可以设置页面中所有相对路径的基准,href中的el表达式表示web应用的根目录。本例中就是/estore-ssm/。Base可以作用在超链接、图片、css链接,js链接,表单提交路径等位置。(jsp中的include,forward等不适用)加上这句后,免去了到处写绝对路径的麻烦。文档中使用相对路径只要相对于应用根目录写就行了,而且不会出现相对路径叠加问题。查询所有商品和商品搜索的请求均进入此方法,先算记录数和总页数转发到showProductList.do,将页数和总记录数传过去,页号为1商品搜索的search表单项传过来,如果为空,则是查询所有商品为index.jsp补充几个js函数,详见注释。13web.xml的welcome页面Web.xml配置起始页面为index.do,用户输入:8080/estore-ssm时,会提交到:8080/estore-ssm/index.do。首页展示流程如下:index.do由ProductController的index方法处理,跳转到index.jsp。index.jsp页面加载后($(document).ready),调用js函数showAllProducts,提交请求'showAllProducts.do',查询所商品,结果嵌入div。14商品搜索表单商品搜索findProductsByName.jsp,表单提交到js函数searchProducts,由ajax发送请求,表单本身不直接提交。查询结果显示在div(不完全刷新index.jsp)。查询关键字表单项search,js里会按id取值,作为url的参数查询关键字表单项search,js里会按id取值,作为url的参数15head栏“首页”超链接“首页”超链接提交到js函数showAllProducts(),查询所有商品,结果显示在div(不完全刷新index.jsp)。16商品展示页面showProducts.jspshowProducts.jsp已提供,将其贴到webRoot/pages/product文件夹下。16.1jsp页面开头引入jstl标签库showProducts.jsp页面的html部分已经给出,功能实现自己补充,jsp文件中的java代码将全部由el和jstl实现。引入jstl标签库引入jstl标签库16.2查询结果展示先判断查询结果是不是空的,如果是空的,提示用户。如果不是空,使用forEach循环,每一件商品的画一行,显示商品的各项信息。${productList}表示取出某一范围中名称为productList的属性值。如果没有指定哪一个范围的productList,所以它会依序从Page、Request、Session、Application范围查找。假如途中找到productList,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。如果想明确指定从request中取属性,可以使用${requestScope.productList}如果想明确指定从session中取属性,可以使用${sessionScope.productList}如果productList长度为0,提示没有符合条件的商品如果productList长度为0,提示没有符合条件的商品显示商品的名字,商品图片名要拼接到img路径中。如果discount是0,显示市场价(原价)。如果是1,显示市场价(原价)和销售价(现价),对productList列表进行循环,每次取出一个商品对象,命名为product显示商品的名字,商品图片名要拼接到img路径中。如果discount是0,显示市场价(原价)。如果是1,显示市场价(原价)和销售价(现价),对productList列表进行循环,每次取出一个商品对象,命名为product16.3分页导航分页导航栏,从请求参数中取出总页数、总记录数、当前页号显示在页面上。点击“下一页”时将页号+1,点击“上一页”时将页号-1,调用js函数nextAndPrevious。调用js函数nextAndPrevious,传递4个参数这里用的都是${param.***},后面介绍了${param.***}和${***}的区别,请仔细阅读调用js函数nextAndPrevious,传递4个参数这里用的都是${param.***},后面介绍了${param.***}和${***}的区别,请仔细阅读${param.pageNum}和${pageNum}的区别如下:(1)${pageNum}相当于:request.getAttribute(“pageNum”);//以request存储属性为例session.getAttribute(“pageNum”);//以session存储属性为例使用下面语句放入的属性都可以使用${pageNum}取出:request.addAttribute(“pageNum”,20);session.addAttribute(“pageNum”,20);controller里的:modelAndView.addObject(“pageNum”,20);(2)${param.pageNum}相当于request.getParamter(“pageNum”);如果是请求url里带的参数(get或者post),均可以通过${param.pageNum}取出,例如showProductList.do?pageNum=5或者表单里有名为pageName的表单项,提交时,也是请求参数。17测试浏览器输入:8080/estore-ssm,进入首页,测试分页效果输入任意商品名进行查询,查询到结果、查询不到结果均要测试。点击“首页”回到首页。3用户登录和退出1运行效果2代码和页面架构3Customer实体类3CustomerDao和Customer.xml映射文件CustomerDao添加一个方法,按照用户名和密码查询用户,返回用户对象。4CustomerService和CustomerServiceImpl在类上设置启用事务,只读。类里的方法,没有设置事务的,默认使用类的设置。需要增删改的方法,重新设置事务的readOnly在类上设置启用事务,只读。类里的方法,没有设置事务的,默认使用类的设置。需要增删改的方法,重新设置事务的readOnly5CustomerController类6index.jsp为index.jsp添加弹出消息框的语句。和第5节结合,也可以统一用一个“message”存储提示消息,不一定要分两个。登录提交时并未采用ajax提交请求,而是直接提交,因为登录成功后不能只刷新中区,要完全刷新index.jsp,否则“successLogin.jsp”不会刷新(除非再写代码刷新左下角区域)。退出功能也是。7login.jsp的提交地址登录提交时并未采用ajax提交请求,而是直接提交,因为登录成功后不能只刷新中区,要完全刷新index.jsp,否则“successLogin.jsp”不会刷新(除非再写代码刷新左下角区域)。退出功能也是。提交地址,去CustomerController类找匹配的@RequestMapping。表单提交前先验证不空提交地址,去CustomerController类找匹配的@RequestMapping。表单提交前先验证不空8为successLogin.jsp页面添加登录成功信息9为left.jsp页面添加条件判断为left.jsp页面添加条件判断,如果用户未登录,包含登录窗口login,如果用户已经登录,包含登录信息窗口successLogin。10为showProducts.jsp添加判断代码为showProducts页面添加判断代码,未登录时提示不能查看详情,登录后提供查看超链接。查看详情,可以按照商品id查询商品信息,再转到商品详情页面,也可以将当前的商品信息直接传到详情页面去。11用户退出(1)为successLogin页面的退出登录添加超链接,如下:(2)为CustomerController添加logout方法:12测试登录和退出4用户注册1运行效果数据填满之后点提交,下面两种情况均只替换中部div内容:数据填满之后点提交,下面两种情况均只替换中部div内容:用户名被占用,提示用户,回注册页面(div填充register.jsp页面)如果没有被占用,向tb_customer表中插入一行用户信息,回首页(div填充所有商品页面)2CustomerDaoCustomerDao添加两个方法,一个用来查询用户名是否被占用,另一个向tb_customer表中插入新新用户信息。(如有别的想法,dao类和映射文件请自行修改)对应的customer.xml文件的sql映射请自行补充。3CustomerService和CustomerServiceImpl分别添加两个方法,和上节两个方法对应,自行补充。CustomerServiceImpl类中,需要更改数据表的方法上(insertNewCustomer方上),加下面事务注解:@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)4CustomerController类(1)添加方法用于跳转到注册页面,方法头如下,内容自行补充:(2)添加方法,在注册表单提交时调用。用于验证用户名是否存在,如果不存在,向用户表中插入新用户信息,方法头如下:调用service的××方法,判断用户名是否已经被占用if(用户名被占用){存储错误提示信息返回register.jsp}else{调用service的××方法,向用户表中插入新用户信息存储成功提示信息返回showAllProduct}提示信息如何在两个页面中取出,并显示,请参考登录时的错误提示信息。5index.jsp为index.jsp添加js函数,一个用于跳转到注册页面,一个用户提交注册表单。6“注册”超链接和注册表单(1)点击“注册”超链接时(在login.jsp上),调用js函数register,将register.jsp页面嵌入div。(2)注册页面为register.jsp(已经提供),将其贴到pages/customer文件夹下。注册表单提交时,调用js函数checkUserAndInsert提交请求,并将结果嵌入div。结果有可能是注册表单自己(如果用户名重复),也有可能是所有商品页面(如果成功),根据controller的逻辑决定返回页面。7测试测试注册成功和失败,观察数据表数据。5查看商品详情1运行效果2商品详情页面商品详情页面showProductById.jsp已经提供,贴到webRoot/pages/product文件夹中,内容参考运行效果图,自行补充。3ProductController添加方法为ProductController添加方法,查询商品详情,跳转到商品详情页面。4index.jsp点击“查看商品详情”超链接,跳转到下面的函数,提交请求,将结果显示在div中。6.1商品加入购物车1运行效果2tb_cart_item表设计下表请自行创建。3CartItem类在domain包中创建CartItem实体类,类的属性和tb_cart_item表字段对应,以及对应的get,set方法。注意:驼峰命名!4CartItemDao类在dao包中创建CartItemDao接口,添加三个方法,分别用于:(1)判断某用户的购物车是否已经存在某商品。(2)向购物车表中插入一条记录(用户要加入的商品是第一次加入)(3)更改购物车的某商品数量(用户要加入的商品已经在其购物车中)5CartItem.xml映射文件在resources/mappers文件中创建CartItem.xml文件,按照dao中的需求添加三个sql映射。请自行完成。6CartItemService接口和CartItemServiceImpl类(1)service包中创建CartItemService接口,CartItemService接口中创建一个方法,如下:(2)serviceImpl包中创建CartItemServiceImpl类,实现CartItemService接口的addToCart方法,逻辑如下:调用dao的get××××()方法,判断用户是否已经加过此商品if(已经加过此商品){查询出的购物车条目对象数量+1调用dao的modify××方法,更新该购物车条目数量}else{调用dao的insert××方法,向购物车表插入新加入的商品信息}注意:dao的依赖注入!事务注解!7CartItemServiceController类在web包中创建CartItemServiceController类,处理“/cart”的请求。创建方法:@RequestMapping("/addCart")publicModelAndViewaddCart(HttpSessionsession,CartItemcartItem){取出session中的用户对象,取出用户对象的id号将用户id设置到cartItem对象上调用service的addCart方法。设置“成功加入购物”消息,跳转回显示商品详情页面。}8为“放入购物车”添加链接地址<ahref="javascript:addCart(参数自定);">放入购物车</a>Js函数addCart()请参考之前的功能自行完成,功能:调用/cart/addCart.do,将商品id,商品名、数量固定为1,商品价格当参数。几种思路提示:(1)直接把4个值当addCart函数的参数,传到addCart函数内使用,拼接成url,或者{参数名:参数值}。(2)把4个值存在隐藏表单里,addCart函数中使用$('#表单id).serialize()。9测试页面操作,直接查看购物车数据表,看数据是否正确。6.2查看购物车1运行效果2CartItemDao接口和CartItem.xml为CartItemDao接口添加方法为CartItem.xml添加对应的sql映射,自行完成。3CartItemService和CartItemServiceImpl添加相应方法自行完成。4CustomerController类添加方法@RequestMapping("/showCart") publicModelAndViewshowCart(HttpSessionsession){从session中获得用户对象,获得用户id调用service的××方法,查询这个用户的购物车将查询结果list存放在model中跳转到showCart.jsp}5“查看购物车”超链接为“查看购物车”超链接添加href="javascript:showCart();”Js函数showCart()请自行添加,功能:提交cart/showCart.do请求,结果填充到div。6showCart.jsp页面ShowCart.jsp已经提供,请拷贝到webRoot/pages/cart文件夹中。基本思路:如果查询到的list长度是0,显示“您的购物车是空的”。如果有商品,将商品显示成表格,请根据运行图片自行完成。从1—n的序号和累加总价的提示<c:setvalue="0"var="totalPrice"/>//定义变量totalPrice,值是0<c:setvalue="1"var="i"/>//定义变量i,值是1<c:forEachitems="${cart}"var="cartItem">。。。。。。<c:setvalue="${i+1}"var="i"/>//变量i++//为总价重新赋值<c:setvalue="${totalPrice+cartItem.price*cartItem.quantity}"var="totalPrice"/></c:forEach>7测试查看购物车6.3修改数量、删除商品、清空1运行效果在商品数量文本框中直接修改,根据键盘动作提交。如果数量改成0,直接删除此条目在商品数量文本框中直接修改,根据键盘动作提交。如果数量改成0,直接删除此条目2CartItemDao接口和CartItem.xml为CartItemDao接口添加两个方法,用于删除购物车条目和清空购物车。注意:修改数量方法,之前已经写过了。CartItem.xml映射请自行补充。3CartItemService接口和CartItemServiceImpl类(1)为CartItemService接口添加方法(2)为CartItemServiceImple添加方法publicintmodifyQuantity(CartItemcartItem){if(cartItem的数量是0){调用dao的remove***方法,删除条目}else{调用dao的modify***方法,修改指定条目的quantity}}(3)为CartItemServiceImple添加方法clearCart,直接调用dao的clearCart即可。4CartItemController类添加下面方法 //修改数量(修改和删除统一) @RequestMapping("/modifyQuantity") publicStringmodifyQuantity(CartItemcartItem){ 调用service的modify***方法(可能是删,可能是改数量) 返回显示购物的页面 }@RequestMapping("/clearCart") publicStringclearCart(HttpSessionsession){调用service的clear××方法返回显示购物的页面}5页面动作(1)为showCart添加下面js函数,函数接受要修改的购物车条目id和新数量(可能是0)。提交到cart/modifyQuantity.do,修改后返回的showCart页面嵌入div。(2)清空购物的js,先请用户确认要清空,然后再提交请求。(3)为商品数量的input,添加事件处理,调用上面的js函数。onKeyUp="modifyQuantity('${cartItem.cartItemId}',this.value)"(4)清空购物车超链接到clear()函数。6测试6.4添加用户登录拦截器1作用为了防止用户在未登录时访问跟购物车和订单有关的操作,添加拦截器对发往上述模块的请求进行拦截,如果发现用户尚未登录,打回首页,让用户登录。2创建LoginInterceptor创建包erceptor,其下创建类LoginInterceptor。检查请求,取出session中的用户对象,如果不是null,返回true,请求放过。如果是null,提示用户,返回首页,返回false检查请求,取出session中的用户对象,如果不是null,返回true,请求放过。如果是null,提示用户,返回首页,返回false3配置拦截路径打开estore-servlet.xml,添加下面配置,拦截发往cart的请求,order的请求(还没有做到),orderItem的请求(还没有做到),查看商品详情的请求。在estore-servlet.xml头部增加三个名称空间。7.1跳转到收银结账页面1运行效果1、总金额从购物车页面传过来2、用户名、实名、电话均从session中的用户对象中取得3、为空项,自行填写1、总金额从购物车页面传过来2、用户名、实名、电话均从session中的用户对象中取得3、为空项,自行填写3CartItemServiceController类添加一个跳转到收银台的方法: //去收银台 @RequestMapping("/cartCheckout") publicStringcartCheckout(){ return"cart/cartCheckOut"; }4“去收银台结账”超链接和js自行完成5测试7.2提交订单1运行效果数据填满后点击“提交“数据填满后点击“提交“2实现思路和流程生成订单号向订单表中插入数据(1条)向订单明细表中插入数据(1-n条)--删除当前用户的购物车条目。(1)订单表订单表的数据基本来源于“收银结账”页面。两项除外:订单号和创建时间,这两项在插入订单信息前根据系统时间生成。只要在“收银”页面提交时,从表单信息中取出数据,加上生成的订单号,即可作为插入订单表的数据来源。(2)订单明细表和购物车表订单明细表中的商品id,商品名、单价、数量均来源于购物车表。订单号是生成订单时根据时间生成的,每个订单和其订单明细通过订单号关联。从购物车表中取出当前用户的购物车条目,加上生成的订单号,即可作为订单明细的数据来源。购物车表订单明细表购物车表订单明细表3Order和OrderItem实体类在domain包中创建Order和OrderItem实体类,对应tb_order和tb_order_item表。4OrderDao和Order.xmlOrder.xml请自行完成5OrderItemDao和OrderItem.xml一个订单的订单明细可能超过一条,方法的参数是购物车条目list和订单号由于要执行n据insert,而不只是一句,而且同一个订单的订单明细使用相同的订单号。在insert映射里,使用for-each遍历cart参数,每个条目执行一句insert,每个订单明细的订单号均来源于参数orderId。6CartItemService接口和CartItemServiceImpl类由于该功能是订单模块和购物车模块的交接,所以业务层写在了Cart里,完成此功能要访问购物车,订单和订单明细表,因此要访问三个dao。(1)为CartItemService添加方法。(2)为CartItemServiceImpl类注入OrderDao和OrderItemDao(3)为CartItemServiceImpl类添加方法。 7CartItemServiceController添加方法://生成订单 @RequestMapping("/cartToOrder") publicModelAndViewcartToOrder(HttpSessionsession,Orderorder){ 取得当前用户id调用Service的cartToOrder方法,返回值为订单号 将订单号存储在model中跳转回购物车页面 }8为购物车页面添加提示语句为购物车页面添加提示语句,弹出“提交订单成功,订单号是×××××”的提示。9为“收银结账”页面的表单补充onsubmit通过调用js函数,请求cart/cartToOrder.do,将表单内容当参数。10测试8查看订单和订单明细1运行效果DeliverySign是0表示未出货,是1表示已经出货DeliverySign是0表示未出货,是1表示已经出货2OrderDao3OrderItemDao4OrderController和OrderItemController的转发点击“查看订单明细”时,先按订单号查订单,存储订单数据。然后将请求转发到订单明细查询,根据订单号查订单明细,存储明细信息,最后转到订单明细页面展示。架构和大致流程如下:@Controller@RequestMapping("/order")publicclassOrderController{…@RequestMapping(value="/showOrderDetails")publicModelAndViewshowOrderDetails(HttpSessionsession,StringorderId){ 按照订单号查订单信息,并存储在model中 转发到:orderItem/showOrderDetails.do }}@Controller@RequestMapping("/orderItem")publicclassOrderItemController{ 。。。 @RequestMapping(value="/showOrderDetails") publicModelAndViewshowOrderDetails(StringorderId){ 按照订单号查订单明细,并存储在model中 跳转到orderDetailList.jsp页面 }}9使用mybaits逆向工程改写Mybatis提供一个工具,可以由数据表自动生成实体类、接口和sql映射文件等。我们的改写过程由下面几步组成:(1)使用mybatis-generator生成逆向工程,即由数据表自动生成实体类、dao接口、**mapper.xml映射文件。(2)用生成的实体类、dao接口、**mapper.xml替换原来estore-ssm工程中的对应部分。(3)有了自动生成的一套代码之后,我们就要利用生成的dao接口和example类来执行数据表的增删改查。因此要修改serviceImpl中的相应代码。(4)由于自动生成的实体类和我们自己写的实体类某些数据类型不同,例如:bit型,我们自己写的时候用的int型,生成的实体类用的Boolean型。访问这部分数据的页面el表达式要做些修改。1改写准备由于马上用逆向工程生成的代码和配置文件替换原有estore-ssm的mybaits部分。大家可以选择下面两种操作方式(选其一)。(1)不再创建新工程,而是在estore-ssm工程上直接改写。如果采用此方式,请先estore-ssm工程复制一份,备份到硬盘某位置,待会儿改写的时候,有些部分可以参考下原来的实现方式。(2)创建一个estore-ssm工程的副本,在其上修改。如果采用此方式,则重新创建一个新的web工程,换个名字,把原来estore-ssm中工程中的所有java文件、页面文件、配置文件、资源等一切拷贝到新web工程中。2使用mybatis-generator生成逆向工程2.1创建Java工程并导入mybatis-generatorjar包创建一个Java工程,名字自定,我们用这个工程来生成逆向。导入两个jar包(mysql驱动和mybatis-generator-core)如下:2.2编写配置文件生成逆向工程需要一个配置文件,该配置文件将指明:如何从数据表生成实体类、映射文件、**Dao接口,可以指定这些自动生成的文件的名字、位置等。该文件已经提供,但是需要依据情况做一些修改。为了让生成的各种文件替换到原工程之后,代码错误和改动最小化,配置文件修改准则如下:(1)自动生成的实体类的包名、类名和原estore-ssm的实体类包、类名完全一致。(2)自动生成的**Dao接口的包名、接口名和原estore-ssm的**Dao包和接口完全一致。(3)自动生成的****.xml,sql映射文件放置位置同原estore-ssm的映射文件放置位置完全一致。将generatorConfig.xml文件贴到src文件夹下,依照下面截图,根据实际情况修改参数,请仔细阅读准则和参数含义。生成的实体类所属的包名!这里改成和estore-ssm实体类同包,这样生成的实体类复制到estore-ssm里才不会报错。连接mysql数据库的驱动类名、连接字符串、用户名、密码生成的实体类所属的包名!这里改成和estore-ssm实体类同包,这样生成的实体类复制到estore-ssm里才不会报错。连接mysql数据库的驱动类名、连接字符串、用户名、密码生成的***Dao接口的位置这里改成和estore-ssm的**Dao.xml同一位置,这样生成的接口覆盖到estore-ssm之后,相关的配置文件就不用改了。生成的***mapper.xml文件的位置这里改成和estore-ssm的**Mapper.xml同一位置,这样配置文件覆盖到estore-ssm之后,相关的配置文件就不用改了。生成的***Dao接口的位置这里改成和estore-ssm的**Dao.xml同一位置,这样生成的接口覆盖到estore-ssm之后,相关的配置文件就不用改了。生成的***mapper.xml文件的位置这里改成和estore-ssm的**Mapper.xml同一位置,这样配置文件覆盖到estore-ssm之后,相关的配置文件就不用改了。这几句设置了将哪些数据表生成逆向的文件,设置了5张表(商品、用户、订单、订单明细、购物车)domainObjectName这几句设置了将哪些数据表生成逆向的文件,设置了5张表(商品、用户、订单、订单明细、购物车)domainObjectName用来指定生成的实体类类名mapperName用来指定这张表对于的**Dao接口名实体类名和**Dao接口名字如果不指定,会默认为TbProduct,TbProductMapper(以tb_product表为例)本例将名字指定为和estore-ssm中的实体类和××Dao接口同名,是为了生成的文件覆盖到estore-ssm之后改动最小!2.3生成逆向工程的代码运行下面代码(代码中有读配置文件的语句,文件路径依据实际情况调整),将生成各种逆向工程中的各种文件。运行完之后刷新一下现有的工程,就能看到生成的东西。importjava.io.File;importjava.util.ArrayList;importjava.util.List;importorg.mybatis.generator.api.MyBatisGenerator;importorg.mybatis.generator.config.Configuration;importorg.mybatis.generator.config.xml.ConfigurationParser;importernal.DefaultShellCallback;publicclassTest{ publicstaticvoidmain(String[]args)throwsException{ Listwarnings=newArrayList(); booleanoverwrite=true; //指定逆向工程配置文件 FileconfigFile=newFile("generatorConfig.xml"); ConfigurationParsercp=newConfigurationParser(warnings); Configurationconfig=cp.parseConfiguration(configFile); DefaultShellCallbackcallback=newDefaultShellCallback(overwrite); MyBatisGeneratormyBatisGenerator=newMyBatisGenerator(config, callback,warnings); myBatisGenerator.generate(null); }}2.4生成结果生成的***.xml,sql映射文件请核对一下映射文件的位置是否和estore-ssm一致生成的实体类、每个实体类对应的example类(该类可以用来构造复杂的条件)使用的时候再介绍。请核对一下实体类的包、类名是否和estore-ssm一致生成的**Dao接口请核对一下包、接口名是否和estore-ssm一致生成的***.xml,sql映射文件请核对一下映射文件的位置是否和estore-ssm一致生成的实体类、每个实体类对应的example类(该类可以用来构造复杂的条件)使用的时候再介绍。请核对一下实体类的包、类名是否和estore-ssm一致生成的**Dao接口请核对一下包、接口名是否和estore-ssm一致3将逆向生成的文件替换到estore-ssm工程(或其副本工程)中我使用了副本工程,名为estore-ssm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论