在这里,为表添加一个新的图片字段,可以允许在添加新闻时,上传相关图片,并可以在列表时显示。
ALTER TABLE news ADD (photo varchar2(100) ); |
对应的,映射部分也要修改。
<property name="photo" type="java.lang.String"> <column name="PHOTO" length="100"></column> </property> |
完成之前的DAO和Service代码。
开始编写页面代码。
这里不再使用!作为分发的分隔符,因为新版的Struts2.3中已经不推荐使用此符号,而是建议使用自定义的形式来完成分发,这里通过 _ 来分隔。
<a href="pages/back/news_insertPre.action">添加新闻</a> <br/> <a href="pages/back/news_list.action">新闻列表</a> <br/> |
编写Action,需要调用Service,查询所有新闻类型。
也要完成新闻类型的DAO代码。
编写Action操作
public class NewsAction extends ActionSupport {
private INewsService service;
private List<NewsType> allType;
public String insertPre() throws Exception { allType = service.insertPre(); return "insert"; } |
配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="newsAction" class="org.liky.ssh.back.action.NewsAction" scope="prototype"> <property name="service"> <ref bean="newsServiceImpl" /> </property> </bean>
</beans> |
<package name="back" namespace="/pages/back" extends="my_project_default"> <action name="news_*" class="newsAction" method="{1}"> <result name="insert">/pages/back/news/news_insert.jsp</result> </action> </package> |
其中method表示要执行的方法名,里面的{1}表示取得前面的 第一个 * 来代入到这里。 |
添加表单
<center> <s:form action="news_insert.action" method="post" theme="simple" namespace="/pages/back" enctype="multipart/form-data"> 新闻标题: <s:textfield name="news.title"></s:textfield> 新闻内容: <s:textfield name="news.content" /> <br/> 新闻发布日期:<s:textfield name="news.pubDate" /> <br/> 新闻分类: <s:select list="allType" name="news.newsType.tid" listKey="tid" listValue="tname"></s:select> <br/> 新闻图片: <s:file name="photo"></s:file> <s:submit value="添加"/> </s:form> </center> |
完成Action中的处理。
由于有文件上传功能,因此这里建立一个Uitls类,完成文件上传的处理
public class FileUtils {
/** * 保存文件功能 * * @param orgFile * 要保存的文件 * @param savePath * 保存的路径(物理路径) * @param orgFileName * 原文件名(用来取得扩展名) * @return * @throws Exception */ public static String saveFile(File orgFile, String savePath, String orgFileName) throws Exception { // 生成文件名 String fileName = UUID.randomUUID().toString(); // 处理扩展名 String extName = orgFileName.substring(orgFileName.lastIndexOf("."));
FileOutputStream os = new FileOutputStream(new File(savePath + fileName + extName));
FileInputStream is = new FileInputStream(orgFile);
byte[] data = new byte[1024];
int length = 0; try { while ((length = is.read(data)) != -1) { os.write(data, 0, length); } } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } }
LogUtils.addInfo("保存了一个文件: " + fileName + extName);
return fileName + extName; }
} |
完成Action中的添加操作。
private News news;
private File photo; private String photoFileName;
private String message; private String url;
public String insert() throws Exception { // 文件上传操作 String savePath = ServletActionContext.getServletContext().getRealPath( "/upload") + "/";
String fileName = FileUtils.saveFile(photo, savePath, photoFileName);
news.setPhoto(fileName);
service.insert(news);
LogUtils.addInfo("添加了新闻信息: " + news.getId() + " --> XXX 添加的");
message = "新闻发布成功"; url = "index.jsp" ;
return "forward"; } |
完成列表中显示图片的功能。
列表中这里使用Struts2标签完成迭代。
通过s:if ,s:iterator来完成判断和循环功能:
<center> <table border="1" width="80%"> <tr> <td> 编号 </td> <td> 标题 </td> <td> 内容 </td> <td> 所属分类 </td> <td> 发布日期 </td> <td> 照片 </td> <td> 操作 </td> </tr> <s:if test="allNews != null && allNews.size() > 0"> <s:iterator value="allNews"> <tr> <td> ${id } </td> <td> ${title } </td> <td> ${content } </td> <td> ${newsType.tname } </td> <td> <fmt:formatDate value="${pubDate}" pattern="yyyy-MM-dd" /> </td> <td> <img src="upload/${photo==null?'nophoto.png':photo}" width="100" height="75"/> </td> <td> <a href="news!updatePre.action?news.id=${id}">修改</a> <a href="news!delete.action?news.id=${id}" onclick="return window.confirm('确定要删除吗?');">删除</a> </td> </tr> </s:iterator> </s:if> </table>
<br />
<jsp:include page="/split_page_plugin.jsp"> <jsp:param value="${pageNo}" name="pageNo" /> <jsp:param value="${pageSize}" name="pageSize" /> <jsp:param value="${keyword}" name="keyword" /> <jsp:param value="${column}" name="column" /> <jsp:param value="${count}" name="count" /> <jsp:param value="pages/back/news_list.action" name="URL" /> <jsp:param value="title:新闻标题|content:新闻内容" name="columnData" /> <jsp:param value="3" name="pageStyle" /> </jsp:include> </center> |
完成删除操作,需要多传递一个文件名,删除数据的同时删除图片。
public String delete() throws Exception { service.delete(news.getId());
// 顺便删除图片 String filePath = ServletActionContext.getServletContext().getRealPath( "/upload") + "/"; FileUtils.deleteFile(filePath, news.getPhoto());
LogUtils.addInfo("新闻被删除: " + news.getId() + " --> xxx 删除的");
message = "新闻删除成功"; url = "pages/back/news_list.action";
return "forward"; } |
最后实现修改操作,如果传递了新图片,需要删除原有图片,如果没有传递新图片,则继续保留原有图片内容。
public String updatePre() throws Exception { Map<String, Object> map = service.updatePre(news.getId()); allType = (List<NewsType>) map.get("allType"); news = (News) map.get("news");
return "update"; }
|
<result name="update">/pages/back/news/news_update.jsp</result> |
完成修改页面的处理。
<s:form action="news_update.action" method="post" theme="simple" namespace="/pages/back" enctype="multipart/form-data"> 新闻标题: <s:textfield name="news.title"></s:textfield> <br /> 新闻内容: <s:textfield name="news.content" /> <br /> 新闻发布日期:<s:textfield name="news.pubDate" /> <br /> 新闻分类: <s:select list="allType" name="news.newsType.tid" listKey="tid" listValue="tname"></s:select> <br /> 新闻图片: <s:file name="photo"></s:file> <br /> <s:hidden name="news.id"></s:hidden> <s:if test="news.photo != null"> <s:hidden name="news.photo"></s:hidden> </s:if> <s:submit value="修改" /> </s:form> |
提交后,实现修改操作
public String update() throws Exception { // 先处理文件操作 // 是否上传了新文件 if (photo != null && photo.length() > 0) { // 先删除原有文件 String filePath = ServletActionContext.getServletContext() .getRealPath("/upload") + "/"; FileUtils.deleteFile(filePath, news.getPhoto());
String fileName = FileUtils .saveFile(photo, filePath, photoFileName);
news.setPhoto(fileName);
}
service.update(news);
message = "新闻修改成功 "; url = "pages/back/news_list.action";
return "forward"; } |