今天来做个demo,打开浏览器,通过表单的方式上传图片。
根据上一节,我们知道要弄出一个Servlet。这里我们用常见的方式新建:在左边项目目录的src新建包,对着包右键—new—servlet,这里我们新建出一个AcceptBeautyServlet。
通过这种方式新建的servlet,自动地帮我们在web.xml中注册了。
<servlet>
<description></description>
<display-name>AcceptBeautyServlet</display-name>
<servlet-name>AcceptBeautyServlet</servlet-name>
<servlet-class>com.tao.server.AcceptBeautyServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AcceptBeautyServlet</servlet-name>
<url-pattern>/AcceptBeautyServlet</url-pattern>
</servlet-mapping>
因为我们需要上传图片,需要用到smartupload这个jar包。把它放到WEB-INF的lib文件夹下,并添加到build path。
我们参照这个Servlet来写:
Servlet参照
在html中写表单,用于输入要上传图片的名称、简介和图片。
<form action="/AcceptBeautyServlet" method="post" enctype="multipart/form-data">
图片名称:<input type="text" name="beautyName"><br>
图片介绍:<input type="text" name="beautyDescription"><br>
图片:<input type="file" name="image"><br>
<input type="submit" value="上传">
</form>
在AcceptBeautyServlet中更改代码:
String beautyName = upload.getRequest().getParameter("beautyName");
String beautyDescription = upload.getRequest().getParameter("beautyDescription");
通过saveFile(File,HttpServletRequest)方法可以获得图片的名字。
String imgName = saveFile(file, request);
那一般我们会考虑把这些属性封装起来,构造实体类Beauty。代码略。
构造BeautyDao(),负责数据库的增删改查。
接下来,把这些数据保存到数据库中才是正道。本demo采用oracle数据库。
这里省去若干段oracle安装步骤…
启动oracle服务:右键—我的电脑—管理,展开服务和应用程序—点击“服务”。如果oracle安装成功,会出现下面这些服务。
右键启动OracleOraDb11g_home1TNSListener和OracleServiceORCL两项服务。(注:把这些服务都设置为手动启动,因为这些服务会比较耗电脑性能)
启动PL/SQL Developer,默认的用户名和密码是tiger和scott。你也可以自己新建一个user。
进入PL/SQL Developer界面后,选中左边的table目录,右键,新建一个table。
我们需要引入ojdbc14.jar,add to build path之后,展开Java Resources—Libraries—Web App Libraries—ojdbc14.jar—oracle.jdbc—OracleDriver.class,选中OracleDriver的class文件右键Copy qualified name。
新建util包。新建DBUtil工具类
将复制的qualified name作为Class.forName()的参数。因为getConn方法的参数都是固定的,所以在这里采用方法重载。
//加载驱动
static{
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//增加静态方法,获取数据库连接
public static Connection getConn(String url,String user,String password){
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static Connection getConn(){
return getConn("jdbc:oracle:thin:@localhost:1521:orcl", "tiger", "scott");
}
public static void close(Connection conn,PreparedStatement pst,ResultSet rs){
try {
if (conn!=null) {
conn.close();
}
if (pst!=null) {
pst.close();
}
if (rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
构造BeautyDao(Dao——data access object),负责数据库操作。其中有save方法,用于保存beauty到数据库中。
代码简单,直接上:
// 保存beauty
public void save(Beauty b) {
try {
// 获取连接对象
Connection conn = DBUtil.getConn();
// 构造sql语句
PreparedStatement pst = conn.prepareStatement("insert into beauty values(seq_beauty.nextval,?,?,?)");
// 使用数据代替占位符
pst.setString(1, g.getName());
pst.setString(2, g.getDescription());
pst.setString(3, g.getImageName());
// 执行sql语句
pst.executeUpdate();
// 关闭资源
DBUtil.close(conn, pst, null);
} catch (Exception e) {
e.printStackTrace();
}
}
这里需要说明一下,seq_beauty.nextval是在oracle生成的序列,它的值从0开始,每次增加1。
回到PL/SQL Developer,选中Sequence目录右键new,
回到AcceptBeautyServlet,将beauty信息封装到beauty实体中。因为我们这里没有获取到id,所以我们在Beauty实体中构造一个不带id的构造方法。
Beauty beauty = new Beauty(beautyName,beautyDescription,imgName);
BeautyDao dao = new BeautyDao();
//保存beauty
dao.save(beauty);
最后一波潜规则,收到客户端上传来的图片后给客户端发出响应。
//通知浏览器保存数据成功
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("你上传的beauty已保存到数据库中!!!");
保存,启动tomcat server。
然后通过浏览器访问AcceptBeautyServlet,输入信息,选择本地图片上传。查询oracle中的beauty表,可以发现数据已成功添加到oracle数据库中。