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. AE视频制作 参考 资源 科幻科技风格 开场 公司企业宣传

    == 人类已经堕落,机器军团大举入侵,开始抹除人类,净化地球!-原创-高清正版视频在线观看–爱奇艺 这个视频片头不错.展示效果和音乐. == 外星人入侵地球,只为收集人类大脑!速看科幻电影<天际 ...

  2. C# 中BindingSource 的用法

    .引言 BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用.使用这些API我们可以将Code与各种具体类型数据源进行解耦:使用这些Event我们可以洞 ...

  3. mybatis自动生成service、dao、mapper

    1.config.properties ## 数据库连接参数 jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://loca ...

  4. Java笔记(十七) 异步任务执行服务

    异步任务执行服务 一.基本原理和概念 一)基本接口 1)Runnable和Callable:表示要执行的异步任务. 2)Executor和ExecutorService:表示执行服务. 3)Futur ...

  5. No mapping found for HTTP request with URI [/webapp/] in DispatcherServlet with name 'SpringMVC'

    可能有如下几个原因: 1.是否设置了web目录,在IDEA中,web目录是这样的 如果没有设置,按照下面的方法设置: 选中要设置的模块,点击file.project structure,设置web.x ...

  6. Java WebSocket 线程安全的保证

    Java WebSocket线程安全基于3点: 1 在新的客户端连接时,WebSocket容器会创建一个新的端点实例,对应的会话实例表示从唯一的客户端到该端点实例的唯一连接. 2 每个WebSocke ...

  7. 小甲鱼Python第十四课后习题

    字符串格式化符号含义    符   号    说     明      %c    格式化字符及其ASCII码[>>> '%c' %97        'a']      %s    ...

  8. JS_高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法

    一.位置方法 ECMAScript5为数组实例添加了两个位置:indexOf()和 lastIndexOf().这两个方法接收两个参数:要查找的项和(可选的)表示查找起点位置的索引(如在数组[7,8, ...

  9. 移动应用滑动屏幕方向判断解决方案,JS判断手势方向

    问题分类 滑动屏幕打开相应功能操作. 问题描述 1.用户手动滑动屏幕,根据滑动的方向,打开相应的功能(如:向上滑摇钱树经验明细,向下滑打开任务明细,向左滑打开聚宝盆物品查看等功能),滑动事件捕获问题. ...

  10. .net core使用数据库

    .net core使用数据库 .net core 通过可以通过ef core或其它ORM框架进行数据访问.此处使用EF和Dapper作为示例. 使用EF Core访问数据库 与 .NET Framew ...