搭建WebService开发环境,改进“图片上传”实验

写在前面:
本次实验是在Jsp+servlet+SqlServer实现图片上传、图片详情查看、表格分页实验的基础上进行改进……
(°ー°〃)菜鸟一枚!如有问题欢迎指出!!

结果展示

在这里插入图片描述
1、新建两个工程,一个是Webservice的Server端,一个是Webservice的Client端。
2、把原来业务层里的类(方法)通过Webservice发布出来,提供Client调用。

↓ 画了个简陋的图。。凑合看看
在这里插入图片描述

Server端

——此处有修改——

(之前写的太着急,百度了一个如何发布webservice的文章就开始写了,后续也没有验证!如果之前看过这篇博客的朋友们,对不起!这里误导你们了!因为如果你使用的是Endpoint类的发布方法,是不必导入我之前说的那些jar包的。。)

这里使用的是jdk自带的websevice发布方法
1.6版本的jdk中JAX-WS规范定义了如何发布一个WebService服务。。
但貌似jdk10以上就没有javax.xml.ws这个包了。。所以,如果你的jdk版本高于10那就别往下看了!

在这里插入图片描述
再次感谢这位朋友!

在这里插入图片描述

核心代码

ImageDAOImpl.java

package com.bnuz.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

import com.bnuz.dao.ImageDAO;
import com.bnuz.javabean.Image;
import com.bnuz.util.DBUtil;
/*
 * 这个注解一定要加上!!在ImageDAO中也要加上这个注解
 */
@WebService
public class ImageDAOImpl implements ImageDAO{
	private Connection conn;
	private PreparedStatement ps;
	
	@Override
	public void add(Image image) {
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement("insert into images(title,url) values (?,?)");
			ps.setString(1, image.getTitle());
			ps.setString(2, image.getImgurl());
			ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public List<Image> queryAll() {
		List<Image> images = new ArrayList<Image>();
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement("select * from images");
			ResultSet rs = ps.executeQuery();
			while(rs.next()) {
				int id = rs.getInt("id");
				String title = rs.getString("title");
				String url = rs.getString("url");
				Image image = new Image(id,title,url);
				images.add(image);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return images;
	}

	@Override
	public Image query(int id) {
		Image image = new Image();
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement("select * from images where id = ?");
			ps.setInt(1, id);
			ResultSet rs = ps.executeQuery();
			while(rs.next()) {
				image.setId(id);
				image.setTitle(rs.getString("title"));
				image.setImgurl(rs.getString("url"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return image;
	}

	@Override
	public List<Image> queryScope(int start, int end) {
		List<Image> images = new ArrayList<Image>();
		try {
			conn = DBUtil.getConn();
			ps = conn.prepareStatement("select * from images where id>? and id<?");
			ps.setInt(1, start);
			ps.setInt(2, end);
			ResultSet rs = ps.executeQuery();
			while(rs.next()) {
				int id = rs.getInt("id");
				String title = rs.getString("title");
				String url = rs.getString("url");
				Image image = new Image(id,title,url);
				images.add(image);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return images;
	}

}

发布服务,Endpoint.publish方法含两个参数:1、服务地址;2、服务实现类
在这里插入图片描述
测试发布是否成功
在这里插入图片描述

Client端

先在eclipse中创建一个动态Web项目Client
在这里插入图片描述
wsimport -s . http://127.0.0.1:8848/images?wsdl

随后在eclipse中refresh一下Client项目,refresh后我们将看到Client项目生成了一个com.bnuz.dao.impl包,接着我们就可以调用Server提供给我们的服务编写Client端的代码了!
在这里插入图片描述
上传文件需要用到的jar包 ↓
上传文件需要用到的jar包

Add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图片上传</title>
<style>
	.info-div{
		margin-top:10px;
	}
</style>
</head>
<body>
	<form action="upload" method="post" enctype="multipart/form-data">
		<div class="info-div">
			<label>主题:</label>
			<input type="text" name="title">
		</div>
		<div class="info-div">
			<label>图片:</label>
			<input type="file" name="uploadImg">
		</div>
		<div class="info-div">
			<input type="submit" value="保存">
		</div>
	</form>
</body>
</html>

List.jsp

<%@page import="com.bnuz.dao.impl.Image"%>
<%@page import="java.util.List"%>
<%@page import="com.bnuz.dao.impl.ImageDAOImpl"%>
<%@page import="com.bnuz.dao.impl.ImageDAOImplService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图片列表</title>
</head>
<body>
	<%
		//创建服务视图,视图是从wsdl文件的service标签的name属性获取
		ImageDAOImplService iService = new ImageDAOImplService();
		//获取服务实现类,实现类从wsdl文件的portType的name属性获取
		ImageDAOImpl imageDAOImpl = iService.getPort(ImageDAOImpl.class);
		//获取查询方法,从portType的operation标签获取
		List<Image> images = imageDAOImpl.queryAll();

		int pages = images.size() / 3 + ((images.size() % 3 != 0) ? 1 : 0); //总页数
		int start = 0;

		List<Image> pageImages = imageDAOImpl.queryScope(0, 4);
		if (request.getParameter("page") != null) {
			String s = request.getParameter("page");
			start = Integer.parseInt(s);
			pageImages = imageDAOImpl.queryScope(start * 3 - 3, start * 3 + 1);
		}
		
	%>
	
	<a href="Add.jsp">上传图片</a>
	
	<div style="display: flex; height: 30px; margin-top:10px">
		<form action="List.jsp?page=<%=start - 1%>" method="post">
			<input type="submit" value="上一页">
		</form>
		<form action="List.jsp" method="post">
			<input type="text" name="page"
				value="<%=request.getParameter("page")%>" style="width: 50px;">
			<input type="submit" value="跳转">
		</form>
		<br>

		<form action="List.jsp?page=<%=start + 1%>" method="post">
			<input type="submit" value="下一页">
		</form>
		<label>一共有<%=images.size()%>条数据,共<%=pages%></label>
	</div>

	<table border="1" style="text-align: center;">
		<tr>
			<th style="width: 50px;">id</th>
			<th style="width: 150px;">主题</th>
			<th style="width: 100px;">图片</th>
			<th style="width: 80px;">操作</th>
		</tr>
		<%
			for (Image u : pageImages) {
		%>

		<tr>
			<td><%=u.getId()%></td>
			<td><%=u.getTitle()%></td>
			<td><img style="width: 80px; height: 50px"
				src="<%=u.getImgurl()%>"></img></td>
			<td>
				<form action="Detail.jsp?id=<%=u.getId()%>" method="post">
					<input type="submit" value="查看" name="s">
				</form>
			</td>
		</tr>
		<%
			}
		%>

	</table>
</body>
</html>

Detail.jsp

<%@page import="com.bnuz.dao.impl.Image"%>
<%@page import="com.bnuz.dao.impl.ImageDAOImpl"%>
<%@page import="com.bnuz.dao.impl.ImageDAOImplService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>详情页</title>
</head>
<body>
	<%
		int id = Integer.parseInt(request.getParameter("id"));
		ImageDAOImplService iService = new ImageDAOImplService();
		ImageDAOImpl imageDAOImpl = iService.getPort(ImageDAOImpl.class);
		Image image = imageDAOImpl.query(id);
	%>
	<div>
		<label>主题:</label> 
		<label><%=image.getTitle()%></label>
	</div>
	<div>
		<label>发布人:YE</label>
	</div>
	<div>
		<label>图片:</label><br> 
		<img src="<%=image.getImgurl()%>"
			style="height: 200px; width: 300px;">
	</div>
</body>
</html>

UploadServlet.java

package com.bnuz.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bnuz.dao.impl.Image;
import com.bnuz.dao.impl.ImageDAOImpl;
import com.bnuz.dao.impl.ImageDAOImplService;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

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;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public UploadServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		// 数据库以UTF-8编码解析数据
		request.setCharacterEncoding("UTF-8");

		Image image = new Image();
		ImageDAOImplService iService = new ImageDAOImplService();
		ImageDAOImpl imageDAOImpl = iService.getPort(ImageDAOImpl.class);

		String name = null;
		if (!ServletFileUpload.isMultipartContent(request)) {
			throw new RuntimeException("当前请求不支持文件上传");
		}
		// 为基于磁盘的文件项创建一个FileItem工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 设置临时文件的边界值,大于该值时,上传文件会先保存在临时文件中,否则,上传文件将直接写入到内存
		// 单位:字节,设置边界值1M,一字节=1024M;
		factory.setSizeThreshold(1024 * 1024 * 1);
		// 设置文件临时储存
		String temppath = this.getServletContext().getRealPath("/temp");
		File temp = new File(temppath);
		factory.setRepository(temp);
		// 创建一个新的文件上传处理程序
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 设置每一个item的头部字符编码,其可以解决文件名中文乱码问题;
		upload.setHeaderEncoding("UTF-8");
		// 设置单个文件的最大边界值(这里是2M)
		upload.setFileSizeMax(1024 * 1024 * 2);
		// 设置一次上传所有文件总和的最大值(对上传多个文件起作用,这里最大为5M)
		upload.setSizeMax(1024 * 1024 * 5);
		// 解析请求,获取所有的item
		try {
			//
			// 调用ServletFileUpload.parseRequest方法解析request对象,
			// 得到一个保存了所有上传内容的List对象。
			List<FileItem> items = upload.parseRequest(request);
			// 遍历
			for (FileItem item : items) {
				// 若item为普通表单项
				if (item.isFormField()) {
					// 获取表单中属性名称
					String fieldName = item.getFieldName();
					if (fieldName.equals("title")) {
						// 获取表单属性的值
						name = item.getString("UTF-8");
					}
					System.out.println(fieldName + "=" + name);
					// 若 item为文件表单项
				} else {
					// 获取文件大小
					long size = item.getSize();
					// 获取文件类型
					String contentType = item.getContentType();
					// 获取上传文件原始名字
					String fileName = item.getName();
					System.out.println("文件大小:" + size);
					System.out.println("文件的类型:" + contentType);
					// 如果上传的内容不是图片,则跳出循环,不进行处理
					if ((!"image/jpeg".equals(contentType)) && (!"image/png".equals(contentType))) {
						break;
					}
					// 获取文件名,处理获取到的上传文件的文件名的路径部分,只保留文件名部分
					if (fileName.contains("\\")) {
						// 如果包含则截取字符串
						fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
					}
					// 设置文件名,因为同名的文件会覆盖,所以要修饰文件名,设置毫秒+文件名
					fileName = System.currentTimeMillis() + fileName;
					System.out.println("文件的名称:" + fileName);
					// 获取输入流,其实有上传文件的内容
					InputStream inputStream = item.getInputStream();

					String path = getServletContext().getRealPath("img/");
					System.out.println(path);
					File dirFile = new File(path);
					if (!dirFile.exists()) {
						// 创建多级目录mkdirs()
						dirFile.mkdir();
					}
					// 创建目录文件,将来用于保存上传文件
					File file = new File(path, fileName);
					// 创建文件输出流
					OutputStream os = new FileOutputStream(file);
					// 把输入流中的数据写入到输出流
					int len = 0;
					byte[] buf = new byte[1024];
					while ((len = inputStream.read(buf)) != -1) {
						os.write(buf, 0, len);
					}
					// 图片上传到之后的路径
					path = "img/" + fileName;
					image.setTitle(name);
					image.setImgurl(path);
					//调用ImageDAOImpl接口的add()方法
					imageDAOImpl.add(image);
					os.close();
					inputStream.close();
					item.delete();
				}

			}
			// 上传完毕后回到List.jsp页面
			response.sendRedirect("List.jsp");
		} catch (FileUploadException e) {

			e.printStackTrace();
		}
	}

}

web.xml
加上↓

  <servlet>
  	<servlet-name>upload</servlet-name>
  	<servlet-class>com.bnuz.servlet.UploadServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>upload</servlet-name>
  	<url-pattern>/upload</url-pattern>
  </servlet-mapping>

images.sql

create table images(
	id int identity(1,1) primary key,
	title varchar(50),
	url varchar(255)
);