how2j.cn

下载区
文件名 文件大小
请先登录 19m
增值内容 19m
19m
使用站长秘制下载工具

6分57秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器

步骤 1 : 重申Action层存在的问题   
步骤 2 : 重构后的效果   
步骤 3 : 重构思路   
步骤 4 : 上传专用 Action4Upload   
步骤 5 : 分页专用 Action4Pagination   
步骤 6 : 对象和集合 Action4Pojo   
步骤 7 : 注入服务专用 Action4Service   
步骤 8 : Action4Service新加一个方法t2p()   
步骤 9 : 定义返回页面的 Action4Result   
步骤 10 : 完整版的Action4Result   
步骤 11 : CategoryAction   
步骤 12 : 可运行项目   

步骤 1 :

重申Action层存在的问题

edit
这里放上了CategoryAction的代码,这样的CategoryAction代码完成功能是没有问题的,但是问题恰恰在于,这样一个本来是用于充当控制层(Controller)的类,需要集中应付太多的需求:

1. 返回页面的定义
2. 单个对象的getter setter
3. 集合对象的getter setter
4. 分页对象的getter setter
5. 上传文件对象的getter setter
6. Service层对象的注入
7. 作为控制层进行的访问路径映射


把所有的这些代码,都放在一个类里面,这个类就会显得繁杂,不易阅读,不易维护。 所以这个地方也是很有代码重构价值的。
package com.how2java.tmall.action; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.List; import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.springframework.beans.factory.annotation.Autowired; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.service.CategoryService; import com.how2java.tmall.util.ImageUtil; import com.how2java.tmall.util.Page; @Namespace("/") @ParentPackage("basicstruts") @Results( { /*分类管理*/ @Result(name="listCategory", location="/admin/listCategory.jsp"), @Result(name="listCategoryPage", type = "redirect", location="/admin_category_list"), @Result(name="editCategory", location="/admin/editCategory.jsp"), }) public class CategoryAction { @Autowired CategoryService categoryService; List<Category> categorys; Category category; File img; Page page; @Action("admin_category_list") public String list() { if(page==null) page = new Page(); int total = categoryService.total(); page.setTotal(total); categorys = categoryService.listByPage(page); return "listCategory"; } @Action("admin_category_add") public String add() { categoryService.save(category); File imageFolder= new File(ServletActionContext.getServletContext().getRealPath("img/category")); File file = new File(imageFolder,category.getId()+".jpg"); try { FileUtils.copyFile(img, file); BufferedImage img = ImageUtil.change2jpg(file); ImageIO.write(img, "jpg", file); } catch (IOException e) { e.printStackTrace(); } return "listCategoryPage"; } @Action("admin_category_delete") public String delete() { categoryService.delete(category); return "listCategoryPage"; } @Action("admin_category_edit") public String edit() { int id = category.getId(); category = categoryService.get(Category.class,id); return "editCategory"; } @Action("admin_category_update") public String update() { categoryService.update(category); if(null!=img){ File imageFolder= new File(ServletActionContext.getServletContext().getRealPath("img/category")); File file = new File(imageFolder,category.getId()+".jpg"); try { FileUtils.copyFile(img, file); BufferedImage img = ImageUtil.change2jpg(file); ImageIO.write(img, "jpg", file); } catch (IOException e) { e.printStackTrace(); } } return "listCategoryPage"; } public List<Category> getCategorys() { return categorys; } public void setCategorys(List<Category> categorys) { this.categorys = categorys; } public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public File getImg() { return img; } public void setImg(File img) { this.img = img; } }
步骤 2 :

重构后的效果

edit
CategoryAction 通过继承功能性的父类,将非控制器功能规划到了父类里,
CategoryAction 本身只需要专注于扮演控制器(Controller)本身就行了,不会再出现其他看上去纷繁复杂的其他手段代码
package com.how2java.tmall.action; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import com.how2java.tmall.util.ImageUtil; import com.how2java.tmall.util.Page; public class CategoryAction extends Action4Result{ @Action("admin_category_list") public String list() { if(page==null) page = new Page(); int total = categoryService.total(); page.setTotal(total); categorys = categoryService.listByPage(page); return "listCategory"; } @Action("admin_category_add") public String add() { categoryService.save(category); File imageFolder= new File(ServletActionContext.getServletContext().getRealPath("img/category")); File file = new File(imageFolder,category.getId()+".jpg"); try { FileUtils.copyFile(img, file); BufferedImage img = ImageUtil.change2jpg(file); ImageIO.write(img, "jpg", file); } catch (IOException e) { e.printStackTrace(); } return "listCategoryPage"; } @Action("admin_category_delete") public String delete() { categoryService.delete(category); return "listCategoryPage"; } @Action("admin_category_edit") public String edit() { t2p(category); return "editCategory"; } @Action("admin_category_update") public String update() { categoryService.update(category); if(null!=img){ File imageFolder= new File(ServletActionContext.getServletContext().getRealPath("img/category")); File file = new File(imageFolder,category.getId()+".jpg"); try { FileUtils.copyFile(img, file); BufferedImage img = ImageUtil.change2jpg(file); ImageIO.write(img, "jpg", file); } catch (IOException e) { e.printStackTrace(); } } return "listCategoryPage"; } }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
步骤 4 :

上传专用 Action4Upload

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import java.io.File; public class Action4Upload { protected File img; protected String imgFileName; protected String imgContentType; public File getImg() { return img; } public void setImg(File img) { this.img = img; } public String getImgFileName() { return imgFileName; } public void setImgFileName(String imgFileName) { this.imgFileName = imgFileName; } public String getImgContentType() { return imgContentType; } public void setImgContentType(String imgContentType) { this.imgContentType = imgContentType; } }
步骤 5 :

分页专用 Action4Pagination

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import com.how2java.tmall.util.Page; public class Action4Pagination extends Action4Upload{ protected Page page; public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } }
package com.how2java.tmall.action;

import com.how2java.tmall.util.Page;

public class Action4Pagination extends Action4Upload{
	protected Page page;
	public Page getPage() {
		return page;
	}

	public void setPage(Page page) {
		this.page = page;
	}
	
}
步骤 6 :

对象和集合 Action4Pojo

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import java.util.List; import com.how2java.tmall.pojo.Category; public class Action4Pojo extends Action4Pagination { protected Category category; protected List<Category> categorys; public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public List<Category> getCategorys() { return categorys; } public void setCategorys(List<Category> categorys) { this.categorys = categorys; } }
步骤 7 :

注入服务专用 Action4Service

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import org.springframework.beans.factory.annotation.Autowired; import com.how2java.tmall.service.CategoryService; public class Action4Service extends Action4Pojo{ @Autowired CategoryService categoryService; }
package com.how2java.tmall.action;

import org.springframework.beans.factory.annotation.Autowired;

import com.how2java.tmall.service.CategoryService;

public class Action4Service extends Action4Pojo{

	@Autowired
	CategoryService categoryService;

}
步骤 8 :

Action4Service新加一个方法t2p()

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
@Action("admin_category_edit") public String edit() { int id = category.getId(); category = (Category) categoryService.get(id); return "editCategory"; }
@Action("admin_category_edit") public String edit() { t2p(category); return "editCategory"; }
package com.how2java.tmall.action; import java.lang.reflect.Method; import org.apache.commons.lang3.text.WordUtils; import org.springframework.beans.factory.annotation.Autowired; import com.how2java.tmall.service.CategoryService; public class Action4Service extends Action4Pojo{ @Autowired CategoryService categoryService; /** * transient to persistent * 瞬时对象转换为持久对象 * @param o */ public void t2p(Object o){ try { Class clazz = o.getClass(); int id = (Integer) clazz.getMethod("getId").invoke(o); Object persistentBean = categoryService.get(clazz, id); String beanName = clazz.getSimpleName(); Method setMethod = getClass().getMethod("set" + WordUtils.capitalize(beanName), clazz); setMethod.invoke(this, persistentBean); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
步骤 9 :

定义返回页面的 Action4Result

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; @Namespace("/") @ParentPackage("basicstruts") @Results( { /*分类管理*/ @Result(name="listCategory", location="/admin/listCategory.jsp"), @Result(name="editCategory", location="/admin/editCategory.jsp"), @Result(name="listCategoryPage", type = "redirect", location="/admin_category_list"), }) public class Action4Result extends Action4Service{ }
package com.how2java.tmall.action;

import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

@Namespace("/")
@ParentPackage("basicstruts")  
@Results(
		{
			/*分类管理*/
			@Result(name="listCategory", location="/admin/listCategory.jsp"),
			@Result(name="editCategory", location="/admin/editCategory.jsp"),
			@Result(name="listCategoryPage", type = "redirect", location="/admin_category_list"),
		})

public class Action4Result extends Action4Service{

}
步骤 10 :

完整版的Action4Result

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; @Namespace("/") @ParentPackage("basicstruts") @Results( { /*全局的*/ @Result(name="success.jsp", location="/success.jsp"), @Result(name="fail.jsp", location="/fail.jsp"), /*分类管理*/ @Result(name="listCategory", location="/admin/listCategory.jsp"), @Result(name="editCategory", location="/admin/editCategory.jsp"), @Result(name="listCategoryPage", type = "redirect", location="/admin_category_list"), /*属性管理*/ @Result(name="listProperty", location="/admin/listProperty.jsp"), @Result(name="editProperty", location="/admin/editProperty.jsp"), @Result(name="listPropertyPage", type = "redirect", location="/admin_property_list?category.id=${property.category.id}"), /*产品管理*/ @Result(name="listProduct", location="/admin/listProduct.jsp"), @Result(name="editProduct", location="/admin/editProduct.jsp"), @Result(name="listProductPage", type = "redirect", location="/admin_product_list?category.id=${product.category.id}"), /*产品图片管理*/ @Result(name="listProductImage", location="/admin/listProductImage.jsp"), @Result(name="listProductImagePage", type = "redirect", location="/admin_productImage_list?product.id=${productImage.product.id}"), /*属性值管理*/ @Result(name="editPropertyValue", location="/admin/editProductValue.jsp"), /*用户管理*/ @Result(name="listUser", location="/admin/listUser.jsp"), /*订单管理*/ @Result(name="listOrder", location="/admin/listOrder.jsp"), @Result(name="listOrderPage", type = "redirect", location="/admin_order_list"), /*前台 服务端跳转*/ @Result(name="home.jsp", location="/home.jsp"), @Result(name="register.jsp", location="/register.jsp"), @Result(name="login.jsp", location="/login.jsp"), @Result(name="product.jsp", location="/product.jsp"), @Result(name="category.jsp", location="/category.jsp"), @Result(name="searchResult.jsp", location="/searchResult.jsp"), @Result(name="buy.jsp", location="/buy.jsp"), @Result(name="cart.jsp", location="/cart.jsp"), @Result(name="alipay.jsp", location="/alipay.jsp"), @Result(name="payed.jsp", location="/payed.jsp"), @Result(name="bought.jsp", location="/bought.jsp"), @Result(name="confirmPay.jsp", location="/confirmPay.jsp"), @Result(name="orderConfirmed.jsp", location="/orderConfirmed.jsp"), @Result(name="review.jsp", location="/review.jsp"), /*前台 客户端跳转*/ @Result(name="registerSuccessPage", type = "redirect", location="/registerSuccess.jsp"), @Result(name="homePage", type = "redirect", location="forehome"), @Result(name="buyPage", type = "redirect", location="forebuy?oiids=${oiid}"), @Result(name="alipayPage", type = "redirect", location="forealipay?order.id=${order.id}&total=${total}"), @Result(name="reviewPage", type = "redirect", location="forereview?order.id=${order.id}&showonly=${showonly}"), }) public class Action4Result extends Action4Service { }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import com.how2java.tmall.util.ImageUtil; import com.how2java.tmall.util.Page; public class CategoryAction extends Action4Result{ @Action("admin_category_list") public String list() { if(page==null) page = new Page(); int total = categoryService.total(); page.setTotal(total); categorys = categoryService.listByPage(page); return "listCategory"; } @Action("admin_category_add") public String add() { categoryService.save(category); File imageFolder= new File(ServletActionContext.getServletContext().getRealPath("img/category")); File file = new File(imageFolder,category.getId()+".jpg"); try { FileUtils.copyFile(img, file); BufferedImage img = ImageUtil.change2jpg(file); ImageIO.write(img, "jpg", file); } catch (IOException e) { e.printStackTrace(); } return "listCategoryPage"; } @Action("admin_category_delete") public String delete() { categoryService.delete(category); return "listCategoryPage"; } @Action("admin_category_edit") public String edit() { t2p(category); return "editCategory"; } @Action("admin_category_update") public String update() { categoryService.update(category); if(null!=img){ File imageFolder= new File(ServletActionContext.getServletContext().getRealPath("img/category")); File file = new File(imageFolder,category.getId()+".jpg"); try { FileUtils.copyFile(img, file); BufferedImage img = ImageUtil.change2jpg(file); ImageIO.write(img, "jpg", file); } catch (IOException e) { e.printStackTrace(); } } return "listCategoryPage"; } }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-06-27 站长大大 请问为什么要单独写一个t2p方法呢?
aasdasd

如果 ProductAction继承Action4Result 里面也有edit方法的话 直接写成这样就行了啊 public String edit() { int id = product.getId(); Product= (Product) productService.get(id); return "editProduct"; }




1 个答案

how2j
答案时间:2020-06-29
因为重复用到的地方很多,单独做出来可以进行重用。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-04-09 t2p方法中baseService.get()替换categoryService.get()
xuao




声明 @Resource(name="base") BaseService baseService; @Service("base") BaseServiceImpl{ } 为什么@Resource(name="base"),和@Service("base")程序可以运行,用@Autowired和@Service就不行呢
public class Action4Service extends Action4Pojo{
	@Autowired
	CategoryService categoryService;
	@Resource(name="base")
	BaseService baseService;
	public void t2p(Object o) {

		try {
			Class clazz = o.getClass();
			int id = (Integer) clazz.getMethod("getId").invoke(o);
			System.out.println(this);
			System.out.println(getClass().getName());
			Object persistentBean = baseService.get(clazz, id);

			String beanName = clazz.getSimpleName();
			Method setMethod = getClass().getMethod("set" + WordUtils.capitalize(beanName), clazz);
			setMethod.invoke(this, persistentBean);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			e.getCause();
		}
	}
}

							


1 个答案

how2j
答案时间:2020-04-10
base 方式能用是因为你明确指明了用这么一个具体的实习那, @Autowired 会找某一个实现了 BaseService接口的类,但是有多个实现了接口的类,它就会报错了。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-04-09 关于t2p方法中的疑问
2020-04-08 关于xxxAction继承Action4Result的问题,以及xxxService注入是在啥时候的问题
2019-12-21 继2楼同学问题的提问:CategoryAction 能够获取到其父类@Result 上的信息,但是并不等于说 CategoryAction 也被 @Result 注解了原因是以下这个吗?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 17 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 实践项目-天猫整站SSH-Action重构 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 635924385
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图