文档章节

SpringMVC

mysky221
 mysky221
发布于 2014/11/22 18:58
字数 1959
阅读 841
收藏 32
点赞 1
评论 2
 

简单的HelloWorld示例:

如果往数据库中存入中文字符的话,则要处理中文乱码的问题,方法是:

web.xml中做以下配置:

JSR是记录Java标准的更新。

输入验证:

在实体里使用注解限定属性:

public class User {

    private String username;

    private String password;

    private String nickname;

    private String email;

    // 这里加上注解:

    @NotEmpty(message="用户名不能为空")

    public String getUsername() {

       return username;

    }

    @Size(min=1,max=10,message="密码的长度应该在110之间")

    public String getPassword() {

       return password;

    }

}

controller中使用@Validate来验证用户的输入,BindingResult返回验证结果(实体中定义的)

    @RequestMapping(value="/{username}/update",

method=RequestMethod.POST)

   // BindingResult用来存放错误信息(写在实体里的)

// BindingResult要紧跟@Validate后面

    public String update(@PathVariable String username,

@Validated User user,BindingResult br) {

       if(br.hasErrors()) {// 有错误信息

           //如果有错误直接跳转到add视图

           return "user/update";

       }

       users.put(username, user);

       return "redirect:/user/users";

    }

    //在具体添加用户时,是post请求,就访问以下代码

    @RequestMapping(value="/add",method=RequestMethod.POST)

    public String add(@Validated User user,BindingResult br,

@RequestParam("attachs")MultipartFile[] attachs,

HttpServletRequest req) throws IOException {

//一定要紧跟Validate之后写验证结果类

       if(br.hasErrors()) {

           //如果有错误直接跳转到add视图

           return "user/add";

       }

       String realpath = req.getSession().getServletContext().

getRealPath("/resources/upload");

       System.out.println(realpath);

       for(MultipartFile attach:attachs) {

           if(attach.isEmpty()) continue;

           File f = new File(realpath+"/"+attach

.getOriginalFilename());

           FileUtils.copyInputStreamToFile(attach

.getInputStream(),f);

       }

       users.put(user.getUsername(), user);

       return "redirect:/user/users";

    }

然后在jsp页面显示这些错误信息:

<!-- 此时没有写action,直接提交会提交给/add -->

// 这里为什么是直接给/add不明白,可能是modelAttribute=”user”而使用了参数// 匹配吧。

<sf:form method="post" modelAttribute="user"

                                   enctype="multipart/form-data">

// path=”usernama”就相当于是:name=”username”,会自动使用user.Set方法

    Username:<sf:input path="username"/>

<sf:errors path="username"/><br/>

    Password:<sf:password path="password"/>

<sf:errors path="password"/><br/>

    Nickname:<sf:input path="nickname"/><br/>

    Email:<sf:input path="email"/>

<sf:errors path="email"/><br/>

    Attach:<input type="file" name="attachs"/><br/> 

<input type="file" name="attachs"/><br/> 

<input type="file" name="attachs"/><br/> 

     <input type="submit" value="添加用户"/>

</sf:form>

显示用户:

// value=”/{username}” 表示username是一个路径参数(@PathVariable

// ?这里的这个username好像是跟show方法中的参数保持一致的……

@RequestMapping(value="/{username}",method=RequestMethod.GET)

public String show(@PathVariable String username,Model model) {

    // jsp页面就能用${user.username}取值了

    model.addAttribute(users.get(username));

    return "user/show";

}

【提示】:

l  关于请求方法:只要不是“更新”操作,就用GET请求。

l  关于model.addAttribute(),如果只写参数,那么其key则是使用对象的类型比如:

model.addAttribute(new User());等价于:model.addAttribute(“user”,new User());

修改用户:

// JSP页面

<sf:form method="post" modelAttribute="user">

    Username:<sf:input path="username"/>

<sf:errors path="username"/><br/>

    Password:<sf:password path="password"/>

<sf:errors path="password"/><br/>

    Nickname:<sf:input path="nickname"/><br/>

    Email:<sf:input path="email"/>

<sf:errors path="email"/><br/>

    <input type="submit" value="修改用户"/>

</sf:form>

    // 页面跳转

@RequestMapping(value="/{username}/update",

method=RequestMethod.GET)

    public String update(@PathVariable String username,Model model) {

       model.addAttribute(users.get(username)); // 回显

       return "user/update";// 到此页面

    }

// 真正的修改

@RequestMapping(value="/{username}/update",

method=RequestMethod.POST)

public String update(@PathVariable String username,

@Validated User user,BindingResult br) {

    if(br.hasErrors()) {

       //如果有错误直接跳转到add视图

       return "user/update";

    }

    users.put(username, user);

    return "redirect:/user/users";

}

删除用户:

<c:forEach items="${users }" var="um">

    ${um.value.username }

    ----<a href="${um.value.username }">${um.value.nickname }</a>

    ----${um.value.password }

    ----${um.value.email }—

<a href="${um.value.username }/update">修改</a>

    <a href="${um.value.username }/delete">删除</a><br/>

</c:forEach>

    @RequestMapping(value="/{username}/delete",

method=RequestMethod.GET)

    public String delete(@PathVariable String username) {

       users.remove(username);

       return "redirect:/user/users";

    }

用户登陆、异常处理:

局部异常处理

局部异常处理是放在一个单独的Controller中的异常处理,只为这一个Controller服务。

步骤

1)自定义异常:

public class UserException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public UserException() {

       super();

    }

    public UserException(String message, Throwable cause) {

       super(message, cause);

    }

    public UserException(String message) {

       super(message);

    }

    public UserException(Throwable cause) {

       super(cause);

    }

}

2)在Controller中使用异常:

   

    @RequestMapping(value="/login",method=RequestMethod.POST)

    public String login(String username,String password,

HttpSession session) {

       if(!users.containsKey(username)) {

           throw new UserException("用户名不存在");//在页面可以打印

       }

       User u = users.get(username);

       if(!u.getPassword().equals(password)) {

           throw new UserException("用户密码不正确");

       }

       session.setAttribute("loginUser", u);

       return "redirect:/user/users";

    }

   

    /**

     * 局部异常处理,仅仅只能处理这个控制器中的异常

     */

    @ExceptionHandler(value={UserException.class})

    public String handlerException(UserException e,

HttpServletRequest req) {

       req.setAttribute("e",e);

       return "error";// 返回到error页面

    }

3)在error.jsp中显示异常信息

发现错误:

<h1>${e.message}</h1>

全局异常处理

使用方法是在springMVC配置文件中将自己定义的异常配置成全局的。

    <bean id="exceptionResolver" class="org.springframework.web.servlet.

handler.SimpleMappingExceptionResolver">

       <property name="exceptionMappings">

           <props>

              // 如果发现UserException就跳转到error页面,异常会放在

//exception中,所以在jsp页面要使用exception来取出异常信息

              <prop key="zttc.itat.model.UserException">error</prop>

              // 如果发现空指针异常就到error2页面

<prop key="java.lang.NullPointException">error2</prop>

           </props>

       </property>

    </bean>

在页面打印异常信息:

发现错误:

<h1>${exception.message}</h1>

关于springMVC中的静态文件

比如,我们在页面中引用了一个css文件:

</title>

<link rel="stylesheet" href="<%=request.getContextPath()%>/resources/css/main.css" type="text/css">

</head>

然后我们试图获取这个文件,比如在浏览器中输入文件地址(或者访问使用了该样式的jsp文件,样式不起作用):

http://localhost:8080/项目名/css/main.css

这时候会报404错误。

处理方法是,将所有这些静态文件放到某个文件夹中,然后在spring配置文件中配置,比如,将main.css文件放到/resources/css/目录下,然后在spring配置文件中做如下配置:

<!-- 将静态文件指定到某个特殊的文件夹中统一处理 -->

// location是指要处理的目录;mapping是指要处理的文件,两个星的第一个星代表

// 当前文件夹(resources)的内容第二个星表示文件夹的子文件夹的内容

// 注意要加的斜杠

<mvc:resources location="/resources/" mapping="/resources/**"/>

<bean name="/welcome.html" class="zttc.itat.controller.WelcomeController"></bean>

文件上传:

文件上传现在一般都用Apache的上传包:

commons-fileupload-1.2.2-bin

commons-io-2.1

jsp页面:

<sf:form method="post" modelAttribute="user"

                                   enctype="multipart/form-data">

// path=”usernama”就相当于是:name=”username”,会自动使用user.Set方法

    Username:<sf:input path="username"/>

<sf:errors path="username"/><br/>

    Password:<sf:password path="password"/>

<sf:errors path="password"/><br/>

    Nickname:<sf:input path="nickname"/><br/>

    Email:<sf:input path="email"/>

<sf:errors path="email"/><br/>

    Attach:<input type="file" name="attachs"/><br/> 

<input type="file" name="attachs"/><br/> 

<input type="file" name="attachs"/><br/> 

     <input type="submit" value="添加用户"/>

</sf:form>

如果想上传文件就必须在spring配置文件中配置MultipartResolver视图:

    <!-- 设置multipartResolver才能完成文件上传 -->

    <bean id="multipartResolver"class="org.springframework.

web.multipart.commons.CommonsMultipartResolver">

       <property name="maxUploadSize" value="5000000"></property>

    </bean>

Controller

    //注意:我们上传一个文件的时候参数只要写MultipartFile attachs

    //这样上传的文件自动和attachs做匹配;

    //但是如果是上传多个文件就要用数组MultipartFile[]attachs,这时候文件

    //就不能自动匹配了,解决方法是下面的写法:

@RequestMapping(value="/add",method=RequestMethod.POST)

    public String add(@Validated User user,BindingResult br,

@RequestParam("attachs")MultipartFile[] attachs,

HttpServletRequest req) throws IOException {

//一定要紧跟Validate之后写验证结果类

       if(br.hasErrors()) {

           //如果有错误直接跳转到add视图

           return "user/add";

       }

       String realpath = req.getSession().getServletContext().

getRealPath("/resources/upload");

       System.out.println(realpath);

       for(MultipartFile attach:attachs) {

           //如果多个输入框有的没输入,即有空文件的情况

           if(attach.isEmpty()) continue;

           File f = new File(realpath+"/"+attach

.getOriginalFilename());

           FileUtils.copyInputStreamToFile(attach

.getInputStream(),f);

       }

       users.put(user.getUsername(), user);

       return "redirect:/user/users";

    }

Controller中返回JSON

@RequestMapping(value="/{username}",method=RequestMethod.GET)

public String show(@PathVariable String username,Model model) {

    model.addAttribute(users.get(username));

    return "user/show";

}

//1)若要控制返回某个值的话,则要使用@ReponseBody

//2params=”par”的意思是,若要访问show1,那么必须要有一个参数为par

// 如果没有参数就访问上面的这个show

@RequestMapping(value="/{username}",

method=RequestMethod.GET,params="par")

@ResponseBody

public User show(@PathVariable String username) {

    return users.get(username);

}

【说明】:

访问第一个show的方式:http://localhost:8080/项目名/user/jack/

访问第二个show的方式:http://localhost:8080/项目名/user/jack?par

(这样直接访问的话,会报406错误,缺少http头)

如果想返回一个json,首先导入转json的开发包:jackson-all-1.9.4.jar

然后再访问第二个showhttp://localhost:8080/项目名/user/jack?par

这样就直接将user转成json格式显示。

用户管理

l  新建项目

l  拷贝jar包(Springdist目录下的jar包,Apachelog4jcommons-loggin

commons-dbcpcommons-collectionscommons-pool

l 

© 著作权归作者所有

共有 人打赏支持
mysky221
粉丝 2
博文 46
码字总数 126638
作品 0
南京
加载中

评论(2)

Syion
Syion
面面俱到,赞!
20岁的King
20岁的King
study..
Spring Boot中Starter是什么

比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖。 经过研究,Start...

easonjim ⋅ 2017/09/30 ⋅ 0

Spring Cloud Finchley 正式发布,兼容 Spring Boot 2.0.x

经过数个前期测试版本,Spring Cloud Finchley 终于迎来了正式版本: 下载地址 发行说明 显著变化: 与 Spring Boot 2.0.x 兼容 不支持 Spring Boot 1.5.x 最低要求 Java 8 新增 Spring Clo...

淡漠悠然 ⋅ 06/20 ⋅ 12

第二章——Spring Boot启动器与依赖管理

强烈推荐选择支持依赖管理和可以发布到“Maven中央”仓库的构建系统。推荐使用Maven或Gradle。Spring Boot可以使用其他构建系统(例如,Ant),但支持得并不是很好。 1 依赖管理 Spring Boo...

Leech ⋅ 02/04 ⋅ 0

Spring、Spring Boot与Spring MVC

总论 Spring框架就像一个家族,有众多衍生产品例如boot、security、jpa等等。但他们的基础都是Spring的ioc和aop。ioc提供了依赖注入的容器,aop解决了面向横切面的编程;然后在此二者的基础上...

临江仙卜算子 ⋅ 05/08 ⋅ 2

spring boot 之依赖

spring boot 虽然不强制使用特殊的依赖。但是其提供了一些非常高效的依赖。其中最有如下几个: spring-boot-starter-parent spring-boot-starter-data-jpa数据库连接的依赖。 spring-cloud-c...

乾坤刀 ⋅ 05/28 ⋅ 0

Spring MVC 到 Spring BOOT的简化之路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦。因为...

临江仙卜算子 ⋅ 05/09 ⋅ 0

学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

spring boot 1.5.4 入门和原理(二)

1 spring boot入门 1.1 环境准备 JDK 7及以上 eclipse开发工具 项目管理工具Maven 本文采用、RELEASE(或1.5.2.RELEASE)调试通过。 spring-boot相关项目源码, 码云地址:https://git.oschi...

wyait ⋅ 2017/09/18 ⋅ 0

Spring Cloud Finchley RC1 发布,基于 Spring Boot 2.0.1

Spring Cloud Finchley 的首个候选版 RC1 已发布,该版本基于 Spring Boot 2.0.1 。 更新内容: Spring Cloud Task Release Announcement Spring Cloud Config Set refresh rate for Git re......

王练 ⋅ 04/26 ⋅ 0

Spring Boot 2.0 新特性解读

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 InfoQ 作者|翟永超编辑|郭蕾Spring Boot 2.0 来啦,有哪些新特性?升级吗?写在前面 北京时...

bjweimengshu ⋅ 04/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 30分钟前 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 36分钟前 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 39分钟前 ⋅ 0

Webpack 4 api 了解与使用

webpack 最近升级到了 v4.5+版 01 官方不再支持 node4 以下版本 官方不再支持 node4 以下版本官方不再支持 node4 以下的版本,所以如果你的node版本太低,先开始升级node吧!话说node10 ...

NDweb ⋅ 48分钟前 ⋅ 0

使用nodeJs安装Vue-cli

Vue脚手架就是一个Vue框架开发环境 脚手架的意思是帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要 npm install就可以安装,让我们不需要为了编辑或者一些其...

木筏笔歆 ⋅ 今天 ⋅ 0

【微信小程序开发实战】0x00.开发前准备工作

写在开始 本人资深后端码农一枚,近期项目需求,接触到了微信小程序,将学习过程整理成文分享给小伙伴们,由于是边学边整理难免有表述不对的地方,望大家及时指正,感谢。 本人微信号: dream...

dreamans ⋅ 今天 ⋅ 0

linux redis的安装和php7下安装redis扩展

安装redis服务器 (1)下载安装包: $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz (2)编译程序: $ tar xzf redis-2.8.17.tar.gz $ cd redis-2.8.17 $ make $ cd src &&......

concat ⋅ 今天 ⋅ 0

Guava EventBus源码解析

一、EventBus使用场景示例 Guava EventBus是事件发布/订阅框架,采用观察者模式,通过解耦发布者和订阅者简化事件(消息)的传递。这有点像简化版的MQ,除去了Broker,由EventBus托管了订阅&...

SaintTinyBoy ⋅ 今天 ⋅ 0

http怎么做自动跳转https

Apache 版本 如果需要整站跳转,则在网站的配置文件的<Directory>标签内,键入以下内容: RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME......

Helios51 ⋅ 今天 ⋅ 0

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部