Controller层配置

编写SpringMVC的配置文件

springmvc.xml



<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <context:component-scan base-package="com.rl.ecps.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/shop/"></property>
<property name="suffix" value=".jsp"></property>
</bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1024000"></property>
</bean> </beans>

添加品牌

在原型界面上,我们都是一些“死”数据,我们需要将数据库的记录代替这些“死”数据!

上传图片

服务端console对图片进行上传到我们的图片服务器上,而portal则访问的时候从图片服务器拿到图片…

在前面,我们已经搭建了图片服务器了,那我们怎么将console要上传的图片“丢给”图片服务器呢???

上传图片时使用Jersey 客户端 API 调用 REST 风格的 Web 服务, Jersey 1 是一个开源的、可以用于生产环境的 JAX-RS(RESTful Web Services 的 Java API 规范,JSR-311)实现。通过 Jersey 可以很方便的使用 Java 来创建一个 RESTful Web Services。

配置文件上传解析器:


<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1024000"></property>
</bean>

我们是上传到图片服务器上的,因此需要我们自己配置对应的路径….而这个配置文件应该是写在core的,因为它很有可能是会被重用的。

值得注意的是:文件服务器要设置成可写的【默认是只读的】

参考如下博文:

http://blog.csdn.net/hon_3y/article/details/77840532

编写工具类来获取对应的数据

public class ResourcesUtils {
public static String readProp(String key) {
InputStream in = ResourcesUtils.class.getClassLoader().getResourceAsStream("system.properties");
Properties prop = new Properties();
try {
prop.load(in);
} catch (IOException e) {
e.printStackTrace();
} return prop.getProperty(key);
} }

编写处理文件上传的Controller

如果有多个文件的话或者我们不知道上传的input的name,我们可以使用request对象来获取Map,再来获取对应的文件


//把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 mf = map.get(fileInputName);

而我们现在是知道input的name的,因此,这里我就直接使用MultipartFile对象来获取了

@Controller
@RequestMapping("/upload")
public class UploadEbBrandPicController {
@RequestMapping("/uploadPic.do")
public void uploadPic(@RequestParam MultipartFile imgsFile, Writer writer) throws IOException { //上传文件的名字是不能相同的,因此我们设置一下文件的名称
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); //使用JSON格式把我们的绝对路径和相对路径返回出去。
JSONObject jo = new JSONObject();
jo.accumulate("realPath", realPath);
jo.accumulate("relativePath", relativePath);
String result = jo.toString();
writer.write(result);
}
}

在前端我们是使用ajax进行异步上传文件的,当图片选项修改时,我们就触发事件把图片上传到我们的图片服务器上了,。


function submitUpload(){
var opt = {
//重新指定form的action的值
url:"${path}/upload/uploadPic.do",
type:"post",
dateType:"json",
success:function(responseText){
//解决多余的字符串数据导致无法解析JSON的问题【另外的博文有写】
var jsonObj = $.parseJSON(responseText.replace(/<.*?>/ig,""));
$("#imgsImgSrc").attr("src",jsonObj.realPath);
$("#imgs").val(jsonObj.relativePath);
},
error:function(){
alert("系统错误");
}
};
$("#form111").ajaxSubmit(opt);
}

成功把图片上传到图片服务器中了


数据校验

添加商品的界面是这样子的,需要我们进行校验

而校验我们有两种方式:

  • 前台使用JS校验
  • 后台再进行校验

我们是这样做的:在输入框中自定义了几个属性:reg2表示一定要校验的,reg1表示可校验可不校验。如果reg1有数据的话,那么也要校验


<div class="edit set">
<p><label><samp>*</samp>品牌名称:</label><input type="text" id="brandName" name="brandName" class="text state" reg2="^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$" tip="必须是中英文或数字字符,长度1-20"/>
<span></span>
</p>
<p><label class="alg_t"><samp>*</samp>品牌LOGO:</label><img id='imgsImgSrc' src="" height="100" width="100" />
</p>
<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="亲!您忘记上传图片了。" />
</p> <p><label>品牌网址:</label><input type="text" name="website" class="text state" maxlength="100" tip="请以http://开头" reg1="http:///*"/>
<span class="pos">&nbsp;</span>
</p>
<p><label class="alg_t">品牌描述:</label><textarea rows="4" cols="45" name="brandDesc" class="are" reg1="^(.|\n){0,300}$" tip="任意字符,长度0-300"></textarea>
<span class="pos">&nbsp;</span>
</p>
<p><label>排序:</label><input type="text" id="brandSort" reg1="^[1-9][0-9]{0,2}$" tip="排序只能输入1-3位数的正整数" name="brandSort" class="text small"/>
<span class="pos">&nbsp;</span>
</p>
<p><label>&nbsp;</label><input type="submit" name="button1" d class="hand btn83x23" value="完成" /><input type="button" class="hand btn83x23b" id="reset1" value='取消' onclick="backList('${backurl}')"/>
</p>
</div>

首先,我们先来写前台的校验…

当该表单提交的时候,我们就对表单的数据进行校验

检测每个必填的input输入框数据,如果每个必填的输入框数据都符合内容,那么检测品牌的名字是否重复!


$(function () {
$("#form111").submit(function () {
/*设置标识量为true,如果不校验不通过设置为false*/
var isSubmit = true;
/*得到每个必填的input输入框数据*/
$("[reg2]").each(function () {
var tip = $(this).attr("tip");
var regStr = $(this).attr("reg2");
/*拿到js校验的对象*/
var reg = new RegExp(regStr);
var value = $.trim($(this).val()); /*校验输入的值与校验规则是否匹配*/
if (!reg.test(value)) {
/*把错误的信息填充到span中*/
$(this).next("span").html("<font color='red'>" + tip + "</font>");
isSubmit = false;
//中断each使用return false,不能使用return;和break;
return false;
} else {
//必填的数据规则都通过了,那么判断品牌名字是否有重复的【后台校验】
var inputName = $(this).attr("name");
if (inputName == "brandName") {
$.ajax({
url: "${path}/brand/validateBrandName.do",
type:"post",
async:false,
data:{
brandName:value
},
dataType:"text",
success: function (responseTest) {
if (responseTest == "no") {
$("#brandNameSpan").html("品牌的名称不能相同!!");
isSubmit = false;
return false;
}else{
$(this).next("span").html("");
}
},
error: function () {
alert("系统错误");
}
});
}
}
}); return isSubmit;
});
});

检测名字是否相同的controller方法

    @RequestMapping("/validateBrandName.do")
public void validateBrandName(String brandName, Writer out) throws IOException { //表示成功
String responseTest = "yes"; //根据名字去查找数据库
List<EbBrand> brands = ebBrandService.selectBrandByName(brandName);
//如果返回的集合有Brand了,那么就证明数据库有相同的品牌了
if (brands != null && brands.size() > 0) {
responseTest = "no";
} out.write(responseTest); }

如果品牌名称相同,那么不允许提交!

对于非必填的数据项,如果用户填了数据的话,那么就必须按照我们的规则来写


/*非必填的数据,如果填了就必须按照规则*/
$("[reg1]").each(function () {
var tip = $(this).attr("tip");
var regStr = $(this).attr("reg1");
/*拿到js校验的对象*/
var reg = new RegExp(regStr);
var value = $.trim($(this).val()); /*如果用户填了数据,那么就需要按照规则*/
if(value!=null && value!="") {
if (!reg.test(value)) {
/*把错误的信息填充到span中*/
$(this).next("span").html("<font color='red'>" + tip + "</font>");
isSubmit = false;
//中断each使用return false,不能使用return;和break;
return false;
}else{
//如果改正了,那么就把对应的错误提示清空了。
$(this).next("span").html("");
}
}
});

为了达到更好的用户体验,我们应该在光标焦点离开的时候就进行一次校验

逻辑和上边是一样的,只不过我们使用的是blur方法,而在表单验证的时候使用的是each遍历每一个输入框罢了。


//光标失去焦点的校验
$("#form111").find("[reg2]").blur(function () {
var tip = $(this).attr("tip");
var regStr = $(this).attr("reg2");
/*拿到js校验的对象*/
var reg = new RegExp(regStr);
var value = $.trim($(this).val()); /*校验输入的值与校验规则是否匹配*/
if (!reg.test(value)) {
/*把错误的信息填充到span中*/
$(this).next("span").html("<font color='red'>" + tip + "</font>");
} else {
//必填的数据规则都通过了,那么判断品牌名字是否有重复的【后台校验】
var inputName = $(this).attr("name");
if (inputName == "brandName") {
$.ajax({
url: "${path}/brand/validateBrandName.do",
type: "post",
async: false,
data: {
brandName: value
},
dataType: "text",
success: function (responseTest) {
if (responseTest == "no") {
$("#brandNameSpan").html("品牌的名称不能相同!!");
} else {
//如果改正了,那么就把对应的错误提示清空了。
$(this).next("span").html("");
}
},
error: function () {
alert("系统错误");
}
});
}
}
}); //失去焦点校验
$("#form111").find("[reg1]").blur(function () {
var tip = $(this).attr("tip");
var regStr = $(this).attr("reg1");
/*拿到js校验的对象*/
var reg = new RegExp(regStr);
var value = $.trim($(this).val());
/*如果用户填了数据,那么就需要按照规则*/
if (value != null && value != "") {
if (!reg.test(value)) {
/*把错误的信息填充到span中*/
$(this).next("span").html("<font color='red'>" + tip + "</font>");
} else {
//如果改正了,那么就把对应的错误提示清空了。
$(this).next("span").html("");
}
}
});

移动商城第四篇【Controller配置、添加品牌之文件上传和数据校验】的更多相关文章

  1. 十三:SpringBoot-基于Yml配置方式,实现文件上传逻辑

    SpringBoot-基于Yml配置方式,实现文件上传逻辑 1.文件上传 2.搭建文件上传界面 2.1 引入页面模板Jar包 2.2 编写简单的上传页面 2.3 配置页面入口 3.SpringBoot ...

  2. SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】

    Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...

  3. SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.文件上传 文件上传是项目开发中一个很常用的功能,常见的如头像上 ...

  4. MyEclipse------如何添加jspsmartupload.jar+文件上传到服务器

    下载地址:http://download.csdn.net/detail/heidan2006/182263 如何添加jspsmartupload.jar:右键“Web”工程->properti ...

  5. SpringBoot完美配置阿里云的文件上传

    新建一个config类 AliyunOSS.java @Configuration @Data public class AliyunOSS { private OSSClient ossClient ...

  6. SpringMVC(四)-- springmvc的系统学习之文件上传、ajax&json处理

    资源:尚学堂 邹波 springmvc框架视频 一.文件上传 1.步骤: (1)导入jar包 commons-fileupload,commons-io (2)在springmvc的配置文件中配置解析 ...

  7. 一篇文章,学会jmeter模拟文件上传、下载操作

    最近很多同学都在问jmeter上传,下载文件的脚本怎么做? 正巧这阵子忙完有时间,就来“折腾”一番,哈哈 现整理出来和大家分享 到底该怎么做? 一.准备工作: 上传接口一个(自行开发解决了) 下载接口 ...

  8. 基于hi-nginx的web开发(python篇)——表单处理和文件上传

    hi-nginx会自动处理表单,所以,在hi.py框架里,要做的就是直接使用这些数据. 表单数据一般用GET和POST方法提交.hi-nginx会把这些数据解析出来,放在form成员变量里.对pyth ...

  9. [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例

    原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的. ...

随机推荐

  1. node.js之事件机制

    EventEmitter类 方法名与参数 描述 参数说明 addListener(event,listener) 对指定的事件绑定事件处理函数 参数一是事件名称,参数二是事件处理函数 on(event ...

  2. 如何快速禁用约束 (解决ORA-O2266问题)

    业务场景: 某天truncate大量表时遇到错误ORA-O2266:表中的唯一/主键被启用的外键引用,不想看ER图来禁用大量复杂约束,所以研发了三种套路...   一. 最偷懒套路 如果要一次性导出很 ...

  3. js 本月,下一月,上一月

    <script type="text/javascript"> var curMonth = new Date(); function initDate() { ) + ...

  4. DataTableToList

    很简单的转换功能,这是我在GitHub上复制的一段代码(懒得再去找原地址了),感觉功能还算可以,贴出来分享给大家 /// <summary> /// DataTable to List c ...

  5. 设计一个程序能够将某一个目录下面的所有文件名打印出来---File类的使用

    ,设计一个程序能够将某一个目录下面的所有文件名打印出来 运用到的方法有:返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录:list()           测试此抽象路径名表示的 ...

  6. Extjs6获取Grid里的数据(数据源)

    { xtype: 'grid', sortableColumns: false, reference: 'grid', flex: 1, store: 'panoram.Panoram', colum ...

  7. 用openssl库RSA加密解密

    #include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include < ...

  8. JavaScript封装一个实用的select控件

    最近一直把精力放在项目上面,导致忽略的一些底层的东西.以前就一直觉得原有的select控件很丑,正好周末有时间,试着做了一个简单封装,实现了它的基本功能.我总结了一下,大概分为三个部分: 1.对显示样 ...

  9. java匿名内部类举例

    public class Test { public static void main(String[] args) { //4.匿名内部类 //主要是针对那些不能直接创建对象的抽象类和接口而来的 S ...

  10. linux中文件I/O操作(系统I/O)

    我们都知道linux下所有设备都是以文件存在的,所以当我们需要用到这些设备的时候,首先就需要打开它们,下面我们来详细了解一下文件I/O操作. 用到的文件I/O有以下几个操作:打开文件.读文件.写文件. ...