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.do
public String hello() {
return "index";
} // ===========================获取页面中传进来的参数=======================================================
/**
* 方式一:通过request请求方式接收前台页面传过来的参数
*/
@RequestMapping("/toPerson1.do")
// 访问此方法的url路径为/test/toPerson1.do
public String toPerson1(HttpServletRequest request) {
String name = request.getParameter("name");
System.out.println(name);
return "index";
} /**
* 方式二:通过相匹配的参数列表接收页面参数_String,
* 而且在页面参数和参数列表中的参数类型相容的情况下是可以自动类型转换的_Integer
* 时间类型如果传入的时间格式比较特殊可以通过自定义专门的转换器来解决(属性编辑器)
*/
@RequestMapping("/toPerson2.do")
// 访问此方法的url路径为/test/toPerson2.do
public 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.do
public String toPerson21(@RequestParam("name") String userName, Integer age, Date birthday) {
System.out.println("姓名:" + userName + ",年龄:" + age + ",生日" + birthday);
return "index";
} /**
* 注册时间类型的属性编辑器
*/
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
} /**
* 方式三:如果页面传入的参数和接收的实体类(可以为多个实体)中set方法中的参数一致(首字母大小写可以不一致),
* 那么就可以直接给实体类的属性赋值,没有匹配上的将会被赋值为null
*/
@RequestMapping("/toPerson3.do")
// 访问此方法的url路径为/test/toPerson3.do
public String toPerson3(TestPerson p) {
System.out.println(p);
return "index";
} /**
* 方式三:如过页面传来两个同名的参数值,方法中可以用一个同名参数数组去接收,而且接收到的参数顺序和传入时的相同。
* 如果没有定义成数组传入的参数会以逗号分隔
*/
@RequestMapping("/toPerson4.do")
// 访问此方法的url路径为/test/toPerson4.do
public 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.do
public String upload() {
return "fileUpload";
}
/**
* 文件上传方式一
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value = "/fileUpload.do")
public String fileUpload(HttpServletRequest request) throws Exception {
// 第一步转化request
MultipartHttpServletRequest rm = (MultipartHttpServletRequest) request;
// 获得原始文件
CommonsMultipartFile cfile = (CommonsMultipartFile) rm.getFile("pic");
// 获得原始文件名
String origFileName = cfile.getOriginalFilename();
// 获得原始文件的后缀 XXX.jpg
String 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. SpringMvc的Url映射和传参案例(转)

    Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...

  2. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

  3. SpringMVC前后端分离交互传参详细教程

    温故而知新,本文为一时兴起写出,如有错误还请指正 本文后台基于SpringBoot2.5.6编写,前端基于Vue2 + axios和微信小程序JS版分别编写进行联调测试,用于理解前后端分离式开发的交互 ...

  4. SpringMVC中url映射到Controller

    SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是DispatcherServlet控制器,只要满足web.xml文件中的[url-pattern]的规 ...

  5. DophineSheduler上下游任务之间动态传参案例及易错点总结

    ​   作者简介 ​ 淡丹 数仓开发工程师 5年数仓开发经验,目前主要负责百得利MOBY新车业务 二手车业务及售后服务业务系统数仓建设   业务需求 在ETL任务之间调度时,我们有的时候会需要将上游的 ...

  6. url的进行传参拼接

    在项目中会遇到把这一个页面的参数传到下一页里面,这里我在项目中用到一个例证(大神就绕过吧嘻嘻):url: '/pages/buy/submitOrder/submitOrder?sku_id=' + ...

  7. SpringMVC ModelAndView方法与模板传参接收不到问题

    最近在使用Spring MVC做项目时,碰到一个问题,就是通过ModelAndView与前端模板页面通信时,一直无法在模板中显示出来传过去的参数值. 在网上也查了好久,就是不知道是啥问题,很是郁闷. ...

  8. SpringMVC中使用RedirectAttributes重定向传参,防止暴露参数

    RedirectAttributes是SpringMVC3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的. 当我从jsp页面函数中带参数到controller层方法,方法执行完毕后返回 ...

  9. flask开启debug模式的两种方法、加载配置文件的两种方法、URL传参的四种方法

    from flask import Flask app = Flask(__name__) # app.config.update(DEBUG=True)#开启debug模式 #加载配置文件方法一 # ...

随机推荐

  1. [尝鲜]妈妈再也不用担心 dotnet core 程序发布了: .NET Core Global Tools

    什么是 .NET Core Global Tools? Global Tools是.NET Core 2.1 中一个初次出现的特性.Global Tools提供了一种方法,让开发人员编写的.NET C ...

  2. 【亲测有效】Kali Linux无法安装网易云音乐的解决方案

    问题描述 由于 Kali Linux 的内核是基于 Debian 的,我们在安装网易云音乐的时候更偏向于选择安装网易云音乐 v1.1.0 deepin15(64位) 的包,可是我发现在安装过程中,无法 ...

  3. centos7.4下Jira6环境部署及破解操作记录(完整版)

    废话不多说,以下记录了Centos7针对Jira6的安装,汉化,破解的操作过程,作为运维笔记留存. 0) 基础环境 192.168.10.212 Centos7.4 mysql 5.6 jdk 1.8 ...

  4. Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)

    一.  ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...

  5. nginx下目录浏览及其验证功能、版本隐藏等配置记录

    工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果;而Nginx的目录列表功能默认是关闭的,如果需要打开Nginx的目录列表功能,需要手动配置, ...

  6. Linux大棚命令记录

    查看系统支持的shell: cat  /etc/shells 查看当前系统用的shell: echo $SHELL 从bash切换到zsh: 先yum安装,然后 chsh -s /bin/zsh ,退 ...

  7. js 时间戳转换为日期格式

     //将1525854409000类型的时间转换成“yyyy-MM-dd”或“yyyy-MM-dd hh:mm:ss”   //info.birthday是后台获取到的Date类型的出生日期数据, / ...

  8. linux第二次读书笔记

    <Linux内核设计与实现>读书笔记 第五章 系统调用   第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用 ...

  9. Linux内核分析——ELF文件格式分析

    ELF文件(目标文件)格式主要三种: 1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为 ...

  10. 《Linux内核设计与实现》课本第四章学习总结

    进程调度 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 多任务系统分为两种: 抢占式多任务:Linux提供了抢占式的多任务模式,由调度程序来决定什么时候停止一个进程的运行 ...