目录
创建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()方法
至此,MybatisStruts2的CRUD和文件的传输介绍完毕,由于作者水平有限难免有疏漏,欢迎留言纠错。