Springmvc的基本使用,包括url映射、参数映射、页面跳转、ajax和文件上传

以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了

package sy.controller;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.IOUtils;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.servlet.ModelAndView;import power.FuncConstants;
import power.Permission;
import sy.bean.TestPerson;// 用来标注此类事springMVC管理的控制层的类
@Controller
// 为了防止多个控制层类有相同的方法所以要为每个控制层类起个唯一的标示名
@RequestMapping(value = "/test")
// @Scope("prototype") ,如果不加这个注释那么该controller就是单列的,一般我们不在controller当中定义成员变量所以不用加这个注释,struts2中的action中会加这个注释就是因为里面经常会定义成员变量,如果不加这个注释当有多个请求的时候就会照成数据共享错误
public class TestController {@RequestMapping("/hello.do")// 访问此方法的url路径/test/hello.dopublic String hello() {return "index";}// ===========================获取页面中传进来的参数=======================================================/*** 方式一:通过request请求方式接收前台页面传过来的参数*/@RequestMapping("/toPerson1.do")// 访问此方法的url路径为/test/toPerson1.dopublic String toPerson1(HttpServletRequest request) {String name = request.getParameter("name");System.out.println(name);return "index";}/*** 方式二:通过相匹配的参数列表接收页面参数_String,* 而且在页面参数和参数列表中的参数类型相容的情况下是可以自动类型转换的_Integer*  时间类型如果传入的时间格式比较特殊可以通过自定义专门的转换器来解决(属性编辑器)*/@RequestMapping("/toPerson2.do")// 访问此方法的url路径为/test/toPerson2.dopublic String toPerson2(String name, Integer age, Date birthday) {System.out.println("姓名:" + name + ",年龄:" + age + ",生日" + birthday);return "index";}/*** 方式2.1 如果你页面传入的和用于接收的非要不一样那么可以用@RequestParam指定*/@RequestMapping("/toPerson21.do")// 访问此方法的url路径为/test/toPerson21.dopublic String toPerson21(@RequestParam("name") String userName, Integer age, Date birthday) {System.out.println("姓名:" + userName + ",年龄:" + age + ",生日" + birthday);return "index";}/*** 注册时间类型的属性编辑器*/@InitBinderpublic void initBinder(ServletRequestDataBinder binder) {binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}/*** 方式三:如果页面传入的参数和接收的实体类(可以为多个实体)中set方法中的参数一致(首字母大小写可以不一致),* 那么就可以直接给实体类的属性赋值,没有匹配上的将会被赋值为null*/@RequestMapping("/toPerson3.do")// 访问此方法的url路径为/test/toPerson3.dopublic String toPerson3(TestPerson p) {System.out.println(p);return "index";}/*** 方式三:如过页面传来两个同名的参数值,方法中可以用一个同名参数数组去接收,而且接收到的参数顺序和传入时的相同。* 如果没有定义成数组传入的参数会以逗号分隔*/@RequestMapping("/toPerson4.do")// 访问此方法的url路径为/test/toPerson4.dopublic String toPerson4(String[] name) {for (int i = 0; i < name.length; i++) {System.out.println(name[i]);}return "index";}/*** 方式四:指定form表单的请求方式,如果不指定,那么post和get都可以访问本方法*  desc:@RequestMapping( method=RequestMethod.POST )可以指定请求方式,前台页面就必须要以它制定好的方式来访问,否则出现405错误*/@RequestMapping(value = "/toPerson5.do", method = RequestMethod.POST)public String toPerson5(TestPerson person) {System.out.println(person);return "index";}// ===========================向页面传递参数=======================================================/*** 方式一 desc:方法的返回值采用ModelAndView, new ModelAndView("index", map); ,相当于把结果数据放到request里面*/@RequestMapping("/toPerson6.do")public ModelAndView toPerson6() throws Exception {TestPerson person = new TestPerson();person.setName("james");person.setAge(28);person.setAddress("maami");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Date date = format.parse("1985-04-22");person.setBirthday(date);Map<String, Object> map = new HashMap<String, Object>();map.put("p", person);return new ModelAndView("index", map);}/*** 方式二 desc:直接在方法的参数列表中来定义Map,这个Map即使ModelAndView里面的Map, 由视图解析器统一处理,统一走ModelAndView的接口*/@RequestMapping("/toPerson7.do")public String toPerson7(Map<String, Object> map) throws Exception {TestPerson person = new TestPerson();person.setName("james");person.setAge(28);person.setAddress("maami");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Date date = format.parse("1985-04-22");person.setBirthday(date);map.put("p", person);return "index";}/*** 方式三 desc:在参数列表中直接定义Model,model.addAttribute("p", person);把参数值放到request类里面去,建议使用*/@RequestMapping("/toPerson8.do")public String toPerson8(Model model) throws Exception {TestPerson person = new TestPerson();person.setName("james");person.setAge(28);person.setAddress("maami");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Date date = format.parse("1985-04-22");person.setBirthday(date);// 把参数值放到request类里面去model.addAttribute("p", person);return "index";}// ===========================Ajax的使用=======================================================/*** 方式一 :ajax的请求返回值类型应该是void,参数列表里直接定义HttpServletResponse, 获得PrintWriter的类,最后可把结果写到页面*/@RequestMapping("/ajax.do")public void ajax(String name, HttpServletResponse response) {String result = "hello " + name;try {response.getWriter().write(result);} catch (IOException e) {e.printStackTrace();}}/*** 方式二 :直接在参数的列表上定义PrintWriter,out.write(result);把结果写到页面,建议使用的*/@RequestMapping("/ajax1.do")public void ajax1(String name, PrintWriter out) {String result = "hello " + name;out.write(result);}// ========================跳转 转发和重定向===================================
@RequestMapping("/redirectToForm.do")public String redirectToForm() {//同一个类中 desc:controller内部重定向,redirect:加上同一个controller中的requestMapping的值return "redirect:upload.do";//不同的类中 desc:controller之间的重定向:必须要指定好controller的命名空间再指定requestMapping的值, redirect:后必须要加/,是从根目录开始
//        return "redirect:/test/toForm.do";//同一个类中 desc:controller内部转发,redirect:加上同一个controller中的requestMapping的值
//        return "forward:toForm.do";
    }// ===========================文件上传========================@RequestMapping("/upload.do")// 访问此方法的url路径/test/hello.dopublic String upload() {return "fileUpload";}/*** 文件上传方式一* @param request* @return* @throws Exception*/@RequestMapping(value = "/fileUpload.do")public String fileUpload(HttpServletRequest request) throws Exception {// 第一步转化requestMultipartHttpServletRequest rm = (MultipartHttpServletRequest) request;// 获得原始文件CommonsMultipartFile cfile = (CommonsMultipartFile) rm.getFile("pic");// 获得原始文件名String origFileName = cfile.getOriginalFilename();// 获得原始文件的后缀 XXX.jpgString suffix = origFileName.contains(".") ? origFileName.substring(origFileName.lastIndexOf(".")) : "error";if ("error".equalsIgnoreCase(suffix)) {return "error";}// 获得原始文件的字节数组byte[] bfile = cfile.getBytes();// 新文件名=当前时间的毫秒数+3位随机数String fileName = String.valueOf(System.currentTimeMillis());// 获得三位随机数Random random = new Random();for (int i = 0; i < 3; i++) {fileName = fileName + random.nextInt(9);}// 拿到项目的部署路径String path = request.getSession().getServletContext().getRealPath("/");// 将用户上传的文件保存到服务器上OutputStream out = new FileOutputStream(new File(path + "/upload/" + fileName + suffix));IOUtils.write(bfile, out);out.close();return "success";}/*** 文件上传方式二* @param request* @return* @throws Exception*/@RequestMapping(value = "/fileUpload2.do")public String fileUpload2(@RequestParam(value="pc",required=false) MultipartFile file,HttpServletRequest request) throws Exception {if(file==null){MultipartHttpServletRequest rm = (MultipartHttpServletRequest) request;file=rm.getFile("pic");}String realPath=request.getSession().getServletContext().getRealPath("upload");File destFile=new File(realPath+"/"+UUID.randomUUID().toString()+file.getName());file.transferTo(destFile);//将上传上来的临时文件移到到我们的目标目录,File类型的也有类似的renameTo方法移动文件return "success";}
}

http://www.cnblogs.com/tfgzs/p/5545577.html

SpringMvc的Url映射和传参案例(转)相关推荐

  1. 路由配置url跳转传参_如何配置路由器以进行网络范围的URL记录

    路由配置url跳转传参 Don't be in the dark about who is visiting what web sites on your LAN. Use our two-prong ...

  2. ajax deletemapping,springmvc使用put,delete方法传参问题,以及使用@PutMapping注解和@DeleteMapping注解...

    首先我们要知道@PutMapping,@DeleteMapping的作用: @PutMapping:"对应修改操作,表明是一个修改URL映射". @DeleteMapping:&q ...

  3. SpringMVC 使用注解时控制器传参

    自动注入 默认方法的参数名和网页的属性名相同,会自动注入(自动转换类型) Tips:若方法的参数名和网页的属性名并不相同,可使用注解 @RequestParam(value="网页的属性名& ...

  4. 个人笔记-SpringMVC请求,数组类型参数传参

    数组类型参数 请求参数名与处理器方法形参名保持一致,且请求参数数量大于1个 访问URL:http://localhost/requestParam9?nick=thenema&nick=th ...

  5. 报表通过url向数据集传参

    sql添加if条件 SELECT * FROM [销量] where 1=1 ${if(len(name)==0,""," and 英文简称 ='"+name+ ...

  6. URL地址 问号传参解析

    一.什么是URL参数? URL 参数是追加到 URL 上的一个名称/值对.参数以问号 (?) 开始并采用 name=value 的格式.如果存在多个 URL 参数,则参数之间用一个 (&) 符 ...

  7. 黑马ajax学习笔记02--art-template模板,自动提示,防抖,三级联动,fromData传参及传文件,同源,jsonp,天气预报,CROS,服务器桥接,withCredential跨域登录

    1.模板引擎概述 作用:使用模板引擎提供的模板语法,可以将数据和HTML拼接起来 实际上是实现在客户端做数据拼接 art-template模板引擎 官网:http://aui.github.io/ar ...

  8. vue 如何将参数放到连接上_通过Vue路由传参的两种方式及Vue组件中接收参数的方式...

    1. Vue传参方式 1.1 通过动态路由传参 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那 ...

  9. HTML向Flex传参

    最近有个需求,要在网站中播放一段介绍性的视频,于是做了一个用Flex播放视频的demo.播放视频的代码是以前在网上找的,但是从html页面获得视频地址的时候参数传递问题浪费了很多时间,现整理总结如下: ...

最新文章

  1. Ubuntu 14.04更新为国内阿里源解决apt-get install无法执行的问题
  2. 使用的是html5的canvas将文字转换成图片
  3. 元宇宙iwemeta: 重庆打造“数据之都”,拟成立重庆数据交易所
  4. java定义一个盒子类box_定义一个Box(盒子)类,在该类定义中包括数据成员: length(长),width(宽)和height(...
  5. SVN - 简单使用手册
  6. 安卓模拟器不能上网时可尝试更改成谷歌DNS
  7. 递归获取拉平存储的树每个节点到达的路径
  8. php-resque 轻量级队列
  9. hessian无法获取连接_PPPoE拨号设置完成后无法上网解决方法【详解】
  10. 【2016Esri全球用户大会主题亮点】GIS Apps的交响乐
  11. Python实现康威生命游戏
  12. python爬取图虫网图库
  13. [转载]期权交易策略
  14. 学了Java可以做什么工作
  15. Ventoy的pe盘制作及重装系统步骤【解释的非常清楚!!!】
  16. 在Ubuntu18.04上安装视频播放器smplayer
  17. 那些值得借鉴的的国外创意404错误页面设计
  18. 名帖35 吴叡 隶书《离骚》
  19. P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp
  20. Java中print,printf,println的区别

热门文章

  1. 【高频电子线路】——高频小信号放大器学习笔记总结
  2. skia android编译错误解决
  3. 换钱 (Standard IO)——c++
  4. 崔庆才《Python3网络爬虫开发实战》学习笔记-前言
  5. Android 手机查看 AirPods 电量
  6. 如何在安卓手机上查看airpods pro的电量
  7. 航天恒星服务器虚拟化,基于云服务的卫星应用公共服务平台
  8. 数据基础设施加速数字经济,“河图”引擎推进鲲鹏计算产业
  9. BSF深度搜索时到底是如何回溯的(小tip)
  10. vue.js的简单自动求和计算