最近刚回校,基本都在忙其他项目和自己的事。
接上之前的系列二,放上一部分控制层的代码。这次在里面加入了上传图片的功能。
package edu.fjnu.hotelsys.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import edu.fjnu.hotelsys.domain.Hotel;
import edu.fjnu.hotelsys.service.HotelService;
import edu.fjnu.hotelsys.service.impl.HotelServiceImpl;
public class HotelMgrServlet extends HttpServlet {
private HotelService hotelService = new HotelServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获得当前web服务器的临时文件夹位置 上传的文件大,所以需要先缓存,然后再一并写入数据库
File tempFile =new File(System.getProperty("java.io.tmpdir"));
//在fileupload工具库中,任何一个输入域都是一个磁盘文件项 前端那些条条框框就是磁盘文件项,也叫普通表单域
//图片就不是磁盘文件项,是文件上传域
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
factory.setRepository(tempFile);
ServletFileUpload sfu = new ServletFileUpload(factory);//过滤请求数据
sfu.setSizeMax(5000000);
List<FileItem> fileItems = null ;
String act =null;
if(sfu.isMultipartContent(request)){ //判断是否是多段提交请求
try {
fileItems = sfu.parseRequest(request); //队请求过滤,获得所有文件项
for(FileItem item :fileItems) {
if(item.isFormField() && item.getFieldName().equals("act")){
act =item.getString("utf-8");
break;
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}else
act = request.getParameter("act");
if("create".equals(act)){
try {
this.create(request, response,fileItems);
} catch (FileUploadException e) {
e.printStackTrace();
}
}else if("loadAllHotel".equals(act)){
this.loadAllHotel(request, response);
}else if("forCreate".equals(act)){
this.forCreate(request, response);
}else if("del".equals(act)){
this.deleteHotel(request, response);
}else if("forUpdate".equals(act)){
this.forUpdate(request, response);
}else if("update".equals(act)){
this.updateHotel(request, response);
}else if("getpic".equals(act)){
this.getHotelPic(request, response);
}
}
/**
* 跳转到新建分店页面
* @param request
* @param response
* @throws ServletException
* @throws IOException
* @author Harry
*/
private void forCreate (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{
request.getRequestDispatcher("/jsps/hotel/input_hotel.jsp").forward(request, response);
}
/**
* 跳转到修改分店信息页面
* @param request
* @param response
* @throws ServletException
* @throws IOException
* @author Harry
*/
private void forUpdate(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{
int id = Integer.parseInt(request.getParameter("hotelId"));
Hotel hotel = hotelService.findHotelById(id);
System.out.println(hotel.getHotelName());
request.setAttribute("hotel", hotel);
request.getRequestDispatcher("/jsps/hotel/update_hotel.jsp").forward(request, response);
}
/**
* 创建分店
* @param request
* @param response
* @author Harry
* @param fileItems2
* @throws IOException
* @throws FileUploadException
* @throws Exception
*/
private void create (HttpServletRequest request,
HttpServletResponse response, List<FileItem> fileItems) throws IOException, FileUploadException {
Hotel hotel = new Hotel();
for(FileItem item:fileItems){
if(item.isFormField() && item.getFieldName().equals("hotelname"))
hotel.setHotelName(item.getString("utf-8"));
else if(item.isFormField() && item.getFieldName().equals("hoteladdr"))
hotel.setHotelAddr(item.getString("utf-8"));
else if(item.isFormField() && item.getFieldName().equals("hotelphone"))
hotel.setHotelPhone(item.getString("utf-8"));
else if(!item.isFormField() && item.getFieldName().equals("hotelpic")){
byte[] hotelPic = new byte[(int)item.getSize()];
item.getInputStream().read(hotelPic,0,(int)item.getSize());
hotel.setHotelPic(hotelPic);
}
}
hotelService.addHotel(hotel);
response.sendRedirect("HotelMgrServlet?act=loadAllHotel");
}
/**
* 显示所有分店信息
* @param request
* @param response
* @throws ServletException
* @throws IOException
* @author Harry
*/
private void loadAllHotel(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{
List<Hotel> hotelList = hotelService.loadAllHotel();
request.setAttribute("hotelList", hotelList);
request.getRequestDispatcher("/jsps/hotel/list_hotel.jsp").forward(request, response);
}
/**
* 删除分店
* @param request
* @param response
* @throws IOException
* @author Harry
*/
private void deleteHotel(HttpServletRequest request,
HttpServletResponse response) throws IOException{
int id =Integer.parseInt(request.getParameter("hotelId"));
hotelService.deleteHotel(id);
response.sendRedirect("HotelMgrServlet?act=loadAllHotel");
}
/**
* 更新分店信息
* @param request
* @param response
* @author Harry
* @throws IOException
*/
private void updateHotel(HttpServletRequest request,
HttpServletResponse response) throws IOException{
int id = Integer.parseInt(request.getParameter("hotelId"));
Hotel hotel = hotelService.findHotelById(id);
String newname = request.getParameter("hotelname");
String newaddr = request.getParameter("hoteladdr");
String newphone = request.getParameter("hotelphone");
hotel.setHotelName(newname);
hotel.setHotelAddr(newaddr);
hotel.setHotelPhone(newphone);
hotelService.updateHotel(hotel);//数据库更新对象
response.sendRedirect("HotelMgrServlet?act=loadAllHotel");
}
/**
* 查找并得到酒店的图片
* @param request
* @param response
* @author Harry
* @throws IOException
*/
private void getHotelPic(HttpServletRequest request,
HttpServletResponse response) throws IOException{
int hotelId = Integer.parseInt(request.getParameter("hotelId"));
byte[] hotelPic = hotelService.getHotelPic(hotelId);
if(hotelPic ==null || hotelPic.length == 0) {
String defaultPicPath = request.getRealPath("/")+"pics/no-pic.jpg";
FileInputStream fis =new FileInputStream(defaultPicPath);
hotelPic=new byte[fis.available()];
fis.read(hotelPic);
}
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
sos.write(hotelPic);
sos.flush();
sos.close();
}
}
上传的图片的dao层的代码也进行了一部分变动
主要是一个add,和一个gethotelpic
private static final String SQL_ADD="insert into hotel(hotel_name,hotel_addr,hotel_phone,hotel_room_count,hotel_pic) values(?,?,?,?,?)";
private static final String SQL_GETPIC="select hotel_pic from hotel where hotel_no=?";
/**
* 添加酒店
* @param hotel
* @author Harry
*/
public void addHotel(Hotel hotel) {
conn=DBUtils.getInstance().getConn(); // 找连接池拿一个连接对象
try{
pstmt=conn.prepareStatement(SQL_ADD);//动态sql语句,创建一个statement对象,用来发送sql参数给数据库
//Creates a PreparedStatement object for sending parameterized SQL statements to the database
pstmt.setString(1, hotel.getHotelName());//设置上述提到的问号,这是jdbc防sql注入的一个手段
pstmt.setString(2, hotel.getHotelAddr());
pstmt.setString(3, hotel.getHotelPhone());
pstmt.setInt(4, hotel.getHotelRoomCount());
InputStream sbs = new ByteArrayInputStream(hotel.getHotelPic());
pstmt.setBlob(5, sbs);
System.out.println(sbs);
pstmt.executeUpdate();//执行
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtils.getInstance().ReleaseRes(conn, pstmt, null);//finally,一定执行,释放连接
}
}
/**
* 通过酒店id得到酒店图片
* @param hotelId
* @author Harry
*/
public byte[] getHotelPic(Integer hotelId) {
conn =DBUtils.getInstance().getConn();
byte[] hotelPic = null ;
try {
pstmt = conn.prepareStatement(SQL_GETPIC);
pstmt.setInt(1, hotelId);
rset=pstmt.executeQuery();
if(rset.next()){
java.sql.Blob blob = rset.getBlob("hotel_pic");
if(blob != null) {
InputStream inStream = blob.getBinaryStream();
hotelPic = new byte[(int)blob.length()];
inStream.read(hotelPic);
inStream.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
}finally {
DBUtils.getInstance().ReleaseRes(conn, pstmt, rset);
}
return hotelPic;
}
大致放上这些,有啥不清楚的,可以私信我。或者发我邮箱 hhooong@163.com
没想到没发布到主页,也有几十的浏览量
测试地址是139.129.12.4:8080/hotel
顺便加入了用户名和密码
aaa aaa123