Struts2的CRUD和文件的传输

目录

CRUD

文件的传输

上传

下载


创建Maven项目,配置pom.xml

   <properties>
      <junit.version>4.12</junit.version>
      <servlet.version>4.0.0</servlet.version>
      <struts2.version>2.5.13</struts2.version>
      <mysql.version>5.1.44</mysql.version>
      <jstl.version>1.2</jstl.version>
      <standard.version>1.1.2</standard.version>
      <tomcat.jsp.version>9.0.1</tomcat.jsp.version>
  </properties>

CRUD

以下所有操作都在Dao层

/**
	 *  书本新增
	 * @param b
	 */
	public void addBook(Book b) {
			String sql="insert into t_book(book_name,book_price,book_type) values(?,?,?)";
			super.executeUpdate(sql, new Object[] {
					b.getBook_Name(),
					b.getBook_Price(),
					b.getBook_Type()
			});
			
	}


	/**
	 *  书本删除
	 * @param b
	 */
	public void deleteBook(Book b) {
			String sql="delete from t_book where Book_id="+b.getBook_Id();
			super.executeUpdate(sql, new Object[] {
					b.getBook_Id()
			});
			
	}


	/**
	 * 书本编辑
	 * @param b
	 */
	public void UpdateBook(Book b) {
			String sql="update t_book set book_name=?,book_price=?,book_type=? where book_id=?";
			super.executeUpdate(sql, new Object[] {
					b.getBook_Name(),
					b.getBook_Price(),
					b.getBook_Type(),
					b.getBook_Id()
			});
			
	}
	
	/**
	 * 分页查询
	 * @param book 书本对象
	 * @param pageBean 
	 * @return
	 */
	public List<Book> queryBookPager(Book book, PageBean pageBean) {
		String sql="select  book_id,book_name,book_name_pinyin,book_price,book_type,book_image from t_book where 1=1";
		//按照书本的模糊查询
		if(StringUtils.isNotBlank(book.getBook_Name()))
			sql+=" and book_name like '%"+book.getBook_Name()+"%'";
		//按照书本Id的降序排序
		sql+=" order by book_id desc";
		System.out.println(sql);
		return executeQuery(sql, pageBean, new CallBack<Book>() {

			@Override
			public List<Book> forEach(ResultSet rs) throws SQLException {
				return CommonUtils.toList(rs, Book.class);
			}
		});
		
	}


	/**
	 * 单个查询
	 * @param book
	 * @return
	 */
	public Book querySingPager(Book book) {
		String sql="select  book_id,book_name,book_name_pinyin,book_price,book_type,book_image from t_book where book_id="+book.getBook_Id();
		System.out.println(sql);
		List<Book> lst= executeQuery(sql, null, new CallBack<Book>() {

			@Override
			public List<Book> forEach(ResultSet rs) throws SQLException {
				return CommonUtils.toList(rs, Book.class);
			}
		});
		
		if(null!=lst&&lst.size()!=0)
			return lst.get(0);
		else
			return null;
	}

CommonUtils 结果集处理类

  

package struts.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CommonUtils {
	
	/**
	 * 根据ResultSet数据集,利用反射机制动态赋值并返回List<T>
	 * @param rs ResultSet数据集
	 * @param clazz 实体类对象
	 * @return 返回List实体集合
	 * @throws Exception
	 */
	public static <T> List<T> toList(ResultSet rs,Class<T> clazz){
		//定义实体集合
		List<T> lst=new ArrayList<T>();
		try {
			//获取ResultSet的metadata列信息
			ResultSetMetaData metaData = rs.getMetaData();
			//获取对象属性集合
			Field[] fields=clazz.getDeclaredFields();
			//循环ResultSet
			while(rs.next()) {
				//反射机制实例化
				T obj = clazz.newInstance();
				for (int i = 0; i < metaData.getColumnCount(); i++) {
					//获取列名
					String columnName=metaData.getColumnLabel(i+1).toUpperCase();
					for (Field field : fields) {
						//判断属性名与列名是否相同
						if(field.getName().toUpperCase().equals(columnName)) {
							//获取属性对应的set方法名,方法名首字母大写
							String methodName="set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
							//获取属性对应的set方法
							Method method = obj.getClass().getDeclaredMethod(methodName, field.getType());
							//设置访问权限
							method.setAccessible(true);
							//执行set方法,将数据存储到对象中的相应属性中
							method.invoke(obj, rs.getObject(columnName));
							break;
						}
					}
				}
				lst.add(obj);
			}
		}catch (Exception e){
			e.printStackTrace();
		}
		return lst;
	}
	
	/**
	 * 将ResultSet结果集转换成单个的实体对象
	 * @param rs
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	public static <T> T toEntity(ResultSet rs,Class<T> clazz) throws Exception{
		//获取实体对象的属性数组
		Field[] fields=clazz.getDeclaredFields();
		//获取ResultSet的metadata列信息
		ResultSetMetaData metaData = rs.getMetaData();
		//实体对象
		T obj=null;
		if(rs.next()) {
			//反射机制实例化
			obj=clazz.newInstance();
			for (int i = 0; i < metaData.getColumnCount(); i++) {
				//获取列名
				String columnName=metaData.getColumnLabel(i+1);
				for (Field field : fields) {
					//获取属性名
					String fieldName=field.getName();
					if(fieldName.toUpperCase().equals(columnName.toUpperCase())) {
						//获取属性对应的set方法名,方法名首字母大写
						String methodName="set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
						//获取属性对应的set方法
						Method method = obj.getClass().getDeclaredMethod(methodName, field.getType());
						//设置访问权限
						method.setAccessible(true);
						//执行set方法,将数据存储到对象中的相应属性中
						method.invoke(obj, rs.getObject(columnName));
						break;
					}
				}
			}
		}
		return obj;
	}
	
	/**
	 * 多表查询时返回结果集,利用反射机制赋值 
	 * @param rs
	 * @return 返回List<Map<String,Object>>
	 * @throws Exception
	 */
	public static List<Map<String,Object>> toList(ResultSet rs) throws Exception{
		//定义实体集合
		List<Map<String,Object>> lst=new ArrayList<Map<String,Object>>();
		//获取ResultSet的metadata列信息	
		ResultSetMetaData metaData = rs.getMetaData();
		Map<String,Object> set=null;
		while(rs.next()) {
			set=new HashMap<String,Object>();
			for (int i = 0; i < metaData.getColumnCount(); i++) {
				String columnName=metaData.getColumnLabel(i+1);
				set.put(columnName, rs.getObject(columnName));
			}
			lst.add(set);
		}
		return lst;
	}
}

创建对应的struts-book.xml并引入到struts.xml核心文件中   struts-base.xml

struts-book.xml                继承公共的xml struts-base
<package name="struts-book" extends="struts-base">
            <action name="bookAction_*" class="struts.action.BookAction" method="{1}">
                <result name="list" type="dispatcher">/booklist.jsp</result>
                <result name="success" type="redirect">bookAction_queryBookPager.action</result>
                <result name="update" type="dispatcher">/updateBook.jsp</result>
                <result name="byid" type="dispatcher">/detailBook.jsp</result>
            </action>
    </package>

struts.xml 

<include file="struts-book.xml"/>

Action层

package struts.action;

import com.opensymphony.xwork2.ModelDriven;
import struts.dao.BookDao;
import struts.entity.Book;
import struts.util.PageBean;

import java.util.List;

public class BookAction extends BaseAction implements ModelDriven<Book> {
    private Book book=new Book();
    private BookDao bookDao=new BookDao();
    @Override
    public Book getModel() {
        return book;
    }

    //增删改用重定向,查询用转发
    /**
     * 新增
     * @return
     */
    public String addBook(){
        bookDao.addBook(book);
        return SUCCESS;
    }

    /**
     * 修改
     * @return
     */
    public String updateBook(){
        bookDao.UpdateBook(book);
        return SUCCESS;
    }


    /**
     * 删除
     * @return
     */
    public String deleteBook(){
        bookDao.deleteBook(book);
        return SUCCESS;
    }

    /**
     * 分页查询
     * @return
     */
    public String queryBookPager(){
        PageBean pageBean=new PageBean();
        pageBean.setRequest(request);
        List<Book> books = bookDao.queryBookPager(book, pageBean);
        request.setAttribute("books",books);
        request.setAttribute("pageBean",pageBean);
        return LIST;
    }

    /**
     * 单个查询
     * @return
     */
    public String querySingPager(){
        Book book = bookDao.querySingPager(this.book);
        String type=request.getParameter("Type");
        request.setAttribute("b",book);
        System.out.println(type);
        if(type.equals("编辑")){
            return "update";
        }else{
            return "byid";
        }


    }

}

web.xml

 <!--配置核心过滤器    接受和分发请求
    相当于自定义MVC的jar包的ActionServlert
   -->
  <filter>
    <filter-name>struts</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>

前端的请求路径

        bookAction_方法名.action

文件的传输

文件从哪里来,放哪里去

struts.xml文件设置

1、struts2文件上传大小设置
   <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) 10M=10*1024*1024 -->
   <constant name="struts.multipart.maxSize" value="10485760"/>

2、struts2文件上传类型设置
   根据struts2自带的fileupload拦截器中提供的allowedTypes来进行限制
   <interceptor-ref name="fileUpload">
     <param name="allowedTypes">image/png,image/gif,image/jpeg</param>
   </interceptor-ref>

package struts.action;

import com.opensymphony.xwork2.ModelDriven;
import struts.dao.BookFileDao;
import struts.entity.BookFile;

import java.io.*;

public class BookFileAction extends BaseAction implements ModelDriven<BookFile>{
    private BookFile bookFile=new BookFile();
    private BookFileDao bookFileDao=new BookFileDao();

    //指定默认上传目录
    public static final String DEFAULT_PATH="D:/images/uploads";

    @Override
    public BookFile getModel() {
        return bookFile;
    }
    //书本编号
    public Integer book_Id;
    //文件
    public File bfile;
    //文件类型
    public String bfileContentType;
    //文件名称
    public String  bfileFileName;

    public BookFile getBookFile() {
        return bookFile;
    }

    public void setBookFile(BookFile bookFile) {
        this.bookFile = bookFile;
    }

    public Integer getBook_Id() {
        return book_Id;
    }

    public void setBook_Id(Integer book_Id) {
        this.book_Id = book_Id;
    }

    public String getBfileContentType() {
        return bfileContentType;
    }

    public void setBfileContentType(String bfileContentType) {
        this.bfileContentType = bfileContentType;
    }

    public String getBfileFileName() {
        return bfileFileName;
    }

    public void setBfileFileName(String bfileFileName) {
        this.bfileFileName = bfileFileName;
    }

    //文件上传就是从哪里来放哪里去
    //读流写流
//    上传
    public String upload() {
        System.out.println("文件名称:"+bfileFileName);
        System.out.println("文件类型:"+bfileContentType);
        System.out.println("书本:"+book_Id);
        System.out.println("图片:"+bfile);

        //1.将客户端的图片保存到服务器的指定位置
        //拼接绝地路径(D://images//uploads/1.png)
        String relativePath=DEFAULT_PATH+File.separator+bfileFileName;

        try {
         //创建文件输入流
         InputStream is=new FileInputStream(bfile);
         //创建文件输出流(放哪里去)
         OutputStream out=new FileOutputStream(new File(relativePath));

         //定义读取大小
            byte[] bytes=new byte[1024];

         //定义读取长度
            int len=-1;

            //读流
            while(-1!=(len=is.read(bytes))){
                //写流
                out.write(bytes);
            }

           //关闭和刷新
            out.flush();
            out.close();
            is.close();
        }catch (Exception e){
            e.printStackTrace();
        }



        //2.新增一条书本图片信息
        //3.根据书本编号修改对应的书本信息
        bookFile.setReal_Name(bfileFileName);
        bookFile.setContent_Type(bfileContentType);
        bookFileDao.addBookFile(book_Id,bookFile);
        return  "list";
    }
//    下载
    public String download(){
        //根据书本图片ID查询对应的书本图片
        BookFile bookFile1 = bookFileDao.querySingPager(this.bookFile);
        //拼接绝地路径(D://images//uploads/1.png)     文件下载名字
        String relativePath=DEFAULT_PATH+File.separator+ bookFile1.getReal_Name();



        try{
        //创建文件输入流
        InputStream is=new FileInputStream(new File(relativePath));
        //创建文件输出流(放哪里去)
        OutputStream out=response.getOutputStream();


//       1. 内容类型
        response.setContentType(bookFile1.getContent_Type());

//       2. 处理文件名的中文乱码
       String fileName = bookFile1.getReal_Name();
       fileName = new String(fileName.getBytes("utf-8"), "iso8859-1");

//     3. 设置响应头
       response.setHeader("Content-Disposition","attachment;filename=" + bookFile1.getReal_Name());//文件名

        //定义读取大小
        byte[] bytes=new byte[1024];

        //定义读取长度
        int len=-1;

        //读流
       while(-1!=(len=is.read(bytes))){
           //写流
            out.write(bytes);
         }

        //关闭和刷新
        out.flush();
        out.close();
       is.close();
        }catch (Exception e){
            e.printStackTrace();
        }


        return  null;
    }




}

以下三个属性及类型是struts框架规定的,必须严格按照此类型和属性名定义

文件
public File bfile;
文件类型
public String bfileContentType;
文件名称
public String  bfileFileName;

上传

upload()方法

下载

download()方法

代码地址 提取码:uep8

至此,MybatisStruts2的CRUD和文件的传输介绍完毕,由于作者水平有限难免有疏漏,欢迎留言纠错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值