修改对应的超连接url,controller转发到对应的JSP页面javascript
<a href="${path}/item/toAddItem.do" class="btn80x20" title="添加商品">添加商品</a>
/** * 跳转到添加商品页面 * @return */
@RequestMapping("/toAddItem.do")
public String toAddItem() {
return "item/addItem";
}
咱们发现添加商品页面是由4个选项卡组成:java
在基本信息的选项卡中,仍是须要咱们查询全部的品牌数据,在页面上给用户选择:web
<select id="brandId" name="brandId">
<option value="">请选择</option>
<c:forEach items="${ebBrands }" var="brand">
<option value="${brand.brandId }">${brand.brandName }</option>
</c:forEach>
</select>
咱们在添加品牌的时候已经作过了上传文件的功能了,逻辑大体是同样的,咱们拿过来修改一些东西便可!ajax
在表单form标签中,记得要使用如下的数据类型进行表单提交!sql
enctype="multipart/form-data"
修改对应的name名称数据库
<p><label></label><input type='file' size='27' id='imgsFile' name='imgsFile' class="file" onchange='submitUpload()'/><span id="submitImgTip" class="pos">请上传图片宽为120px,高为50px,大小不超过100K。</span> <input type='hidden' id='imgs' name='imgs' value='' reg2="^.+$" tip="亲!您忘记上传图片了。"/> <span></span> </p>
Jquery代码:json
function submitUpload() {
var opt = {
//从新指定form的action的值
url: "${path}/upload/uploadPic.do",
type: "post",
dateType: "json",
success: function (responseText) {
var jsonObj = $.parseJSON(responseText.replace(/<.*?>/ig, ""));
$("#imgsImgSrc").attr("src", jsonObj.realPath);
$("#imgs").val(jsonObj.relativePath);
},
error: function () {
alert("系统错误");
}
};
$("#form111").ajaxSubmit(opt);
}
到目前位置,咱们的Controller能够拿到Item页面所有的基本属性:ruby
商品的id是使用oracle中的序列进行自动增加。bash
/*对于商品的id,咱们是自增加的。*/
<selectKey keyProperty="itemId" order="BEFORE" resultType="long">
select seqitemid.nextval from dual
</selectKey>
对于审核状态,默认设置为0【待审核】
对于上架状态,默认设置为1【下架】
对于销售量,默认设置为0【并无人购买】markdown
在Mapper中把对应的属性设置默认值。
(#{itemId,jdbcType=DECIMAL}, #{itemName,jdbcType=VARCHAR}, #{itemNo,jdbcType=VARCHAR},
#{brandId,jdbcType=DECIMAL}, #{catId,jdbcType=DECIMAL}, #{tagImgId,jdbcType=DECIMAL},
#{tagImg,jdbcType=DECIMAL}, #{isNew,jdbcType=DECIMAL}, #{isGood,jdbcType=DECIMAL},
#{isHot,jdbcType=DECIMAL}, #{promotion,jdbcType=VARCHAR}, 0,
1, #{imgs,jdbcType=VARCHAR}, #{keywords,jdbcType=VARCHAR},
#{pageDesc,jdbcType=VARCHAR}, #{itemRecycle,jdbcType=DECIMAL}, #{onSaleTime,jdbcType=TIMESTAMP},
#{checkTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUserId,jdbcType=DECIMAL},
sysdate, #{checkerUserId,jdbcType=DECIMAL}, #{fullPathDeploy,jdbcType=VARCHAR},
#{fullPathDeployOffer,jdbcType=VARCHAR}, #{originalItemId,jdbcType=DECIMAL}, #{lastStatus,jdbcType=DECIMAL},
#{merchantId,jdbcType=DECIMAL}, #{itemSort,jdbcType=DECIMAL}, 0,
#{createUserId,jdbcType=DECIMAL}, #{simLevel,jdbcType=DECIMAL}, #{giftDesc,jdbcType=VARCHAR},
#{giftImg,jdbcType=VARCHAR}, #{giftShowType,jdbcType=VARCHAR}, #{imgSize1,jdbcType=VARCHAR}
)
咱们第二个选项卡的原型界面以下:
咱们须要用到另一张表:
所以咱们须要逆向工程对应的表:
<table schema="" tableName="EB_ITEM_CLOB" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false"
>
加载对应的映射文件:
id是EbItemClob没法从页面上获取的,所以咱们须要传递进去。
@Repository
public class EbItemClobDaoImpl extends SqlSessionDaoSupport implements EbItemClobDao {
String nameSpace = "com.rl.ecps.sqlMap.sqlMap.EbItemClobMapper.";
public void saveItemClob(EbItemClob ebItemClob, Long itemId) {
ebItemClob.setItemId(itemId);
this.getSqlSession().insert(nameSpace + "insert", ebItemClob);
}
}
其实就是一个文本域,而该文本域是能带有格式的。之前咱们使用过“富文本编辑器”就是这么的一种,此次咱们使用fckEditor文本编辑器
首先,把咱们的下载下来的文档加入到web目录下。
引入核心的JS文件
<script type="text/javascript" src="<c:url value='/${system }/res/plugins/fckeditor/fckeditor.js'/>"></script>
建立出FCK对象,设置相关属性:
var fck = new FCKeditor("itemDesc");
fck.BasePath = "${path}/ecps/console/res/plugins/fckeditor/";
fck.Config["ImageUploadURL"] = "${path}/upload/uploadForFck.do?typeStr=Image";
fck.Height = 400;
fck.ToolbarSet = "Default";
fck.ReplaceTextarea();
itemDesc就是咱们文档域的id值:
<textarea name="itemDesc" id="itemDesc"></textarea>
建立出处理uploadForFck.do的方法:
@RequestMapping("/uploadForFck.do")
public void uploadForFck(HttpServletRequest request, HttpServletResponse response) throws IOException {
//把request转换成复杂request
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
//得到文件
Map<String, MultipartFile> map = mr.getFileMap();
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
String fileInputName = it.next();
MultipartFile imgsFile = map.get(fileInputName);
//上传文件的名字是不能相同的,所以咱们设置一下文件的名称
String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
Random random = new Random();
for(int i = 0; i < 3; i++){
fileName = fileName + random.nextInt(10);
}
//拿到该文件的原始名称
String originalFilename = imgsFile.getOriginalFilename();
//获取该文件的后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
/*** * 绝对路径是留给页面src属性作显示的 * 相对路径是保存在数据库中,经过input来进行提交的。 */
//得到上传文件的绝对路径
String realPath = ResourcesUtils.readProp("file_path")+"/upload/"+fileName+suffix;
//得到相对路径
String relativePath = "/upload/"+fileName+suffix;
//建立jersy的客户端
Client client = Client.create();
//建立web资源对象
WebResource wr = client.resource(realPath);
//拿到文件的二进制数据,使用web资源对象上传
byte[] bytes = imgsFile.getBytes();
wr.put(bytes);
/** * 在FCK中,咱们就再也不是使用JSON来返回了,咱们使用的是内部的对象 */
UploadResponse ur = new UploadResponse(UploadResponse.EN_OK,realPath);
response.getWriter().print(ur);
}
在controller中使用EbItemClob对象,便可接收咱们的大字段数据!
@RequestMapping("/addItem.do")
public void addItem(EbItem ebItem, EbItemClob ebItemClob) {
}