发表于: 2017-12-13 23:00:22
1 649
今天完成的事情:
使用了各种方式从页面获取数据,以及页面回显.
从页面获取值
第一种方式,使用HttpServlet方式获取.
@RequestMapping("/hello")
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.setViewName("add");
return mv;
}
其实这个方式是很原始,要求类实现Controller接口,我这里用了注解,所以实现的接口就省去了.
通过request.getParameter方式获取
简单给一个modelAndView对象设置了绑定哪个jsp页面,并返回这个modelAndView给视图解析器进行分析.
第二种方式接收页面数据:
//自己定义参数接收(基于同名匹配)
@RequestMapping("/param")
public ModelAndView method1(String name, Integer age, Date birthday, String address) throws Exception {
ModelAndView mv = new ModelAndView();
Student student = new Student(name, age, birthday, address);
logger.info(student);
mv.addObject("测试", student);
mv.setViewName("index");
return mv;
}
自定义参数从页面接收, 这要求在jsp文件中所填写的数据name要和我们定义的一样,不然无法接收.
这里有个重要的是关于Date类型,我们在JSP中
<fieldset>
<legend>用户注册</legend>
<form action="${pageContext.request.contextPath}/ssm/param">
姓名:<input type="text" name="name" id="name"/><br>
年龄:<input type="text" name="age" id="age"/><br>
生日:<input type="text" name="birthday" id="birthday"/><br>
地址:<input type="text" name="address" id="address"/><br>
<input type="submit" value="提交"/>
</form>
</fieldset>
设计的类型也是text类型,但是我们date接收的时候是有格式要求的.如果我们输入1991/12/31这种格式是可以接收,但是输入1991-12-31这种格式就没有办法接收, 因为我们默认的接收格式是1991/12/31.这个时候就需要在我们的bean类里面为Date这个属性设置一个默认的格式.
public class Student {
private String name;
private Integer age;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private String address;
}
有默认格式之后就可以进行存储了
另外设计上了基础格式之后也可以接收这样的格式: yyyy-MM-dd HH:mm:ss
设计成这样就可以接收更多的格式.
第三种,通过我们封装的Bean类进行接收:
//通过model接收参数
@RequestMapping("/model")
public ModelAndView method2(Student student) {
ModelAndView mv = new ModelAndView();
logger.info(student);
mv.addObject("msg", student);
mv.setViewName("index");
return mv;
}
这里我的形式参数使用的是Student对象,下面是对应的jsp页面
<fieldset>
<legend>用户注册</legend>
<form action="${pageContext.request.contextPath}/ssm/model">
姓名:<input type="text" name="name"/> <br>
年龄:<input type="text" name="age" /><br>
生日:<input type="date" name="birthday" /><br>
地址:<input type="text" name="address" /><br>
<input type="submit" value="提交"/>
</form>
</fieldset>
在jsp页面中的的四个数据类型和我们bean类所需要接收的数据是一一对应.这里Date类在jsp使用的date类型的 话,在页面中会成为选择框的形式.
这里date类也是需要我们自己在bean类配置格式,不然也会报400错误,无法匹配.
给页面传值
1.最原始的方式通过servlet-api里面的方法
request.setAttribute(“key”,”value”);
request.getRequestDispathcer(“/index.jsp”).forward(reuqest,response);
2.可以创建ModelAndView的对象,封装模型和数据.(用的比较多)
a.mv.addObject("msg", "今天天气好热");//输入key,value的数据
b.mv.addAllObjects(param);//把一个Map集合放入的域中.
c.mv.addObject(new User("admin","123"));、//直接放对应的属性值,此时会有默认key,默认key为类型全小写字符串.
//自己定义参数接收(基于同名匹配)
@RequestMapping("/param")
public ModelAndView method1(String name, Integer age, Date birthday, String address) throws Exception {
ModelAndView mv = new ModelAndView();
Student student = new Student(name, age, birthday, address);
logger.info(student);
mv.addObject("测试", student);
mv.setViewName("index");
return mv;
}
3.直接返回对象.此时是没有指定对应的视图是什么.所有springMVC给了一个默认的视图,请求名/data1,此时会出现环形请求.
4.直接返回String,返回值最为响应视图的一部分.只是的视图为 前缀+返回值+后缀.此时的数据就放到Model中.,(这种也用得比较多)
@RequestMapping("/like")
public String like(){
return "updateFile";
}
用的最多就是第二种和第四种
上传下载也贴一下.
//上传
@RequestMapping("/like")
public String like(){
return "updateFile";
}
@RequestMapping( "/fileup")
//File不能完全描述一个上传的文件.
public String upload(MultipartFile file)throws Exception{
System.out.println(file.getName());//获取表单名字
System.out.println(file.getSize());//获取上传文件的大笑
System.out.println(file.getContentType());//获取到上传文件的类型
System.out.println(file.getOriginalFilename());//获取上传文件的原始名称
//System.out.println(file.getInputStream());//获取到文件的输入流
InputStream is = file.getInputStream();
OutputStream os = new FileOutputStream("E:\\"+file.getOriginalFilename());
IOUtils.copy(is, os);
is.close();
os.close();
return "index";
}
//下载
@RequestMapping("/download")
public void download(HttpServletResponse response)throws Exception{
//拿到响应流
ServletOutputStream os = response.getOutputStream();
//读取需要被下载的文件
FileInputStream is = new FileInputStream("D:\\1.jpg");
//这个仅是为了能够使用中文名显示下载的文件.
String str = "好图.jpg";
str = new String(str.getBytes("UTF-8"), "ISO8859-1");
response.setHeader("Content-Disposition","attachment;filename="+str);
IOUtils.copy(is, os);
is.close();
os.close();
上传的时候本应该用File类来做形参,可是File类并不能完全接收到我们上传的数据的所有信息,因此Spring提供了一个MultipartFile来接收页面的上传的文件的属性以及完成本地存储.(其实应该也是一个File类的包装类)
String str = "好图.jpg";
str = new String(str.getBytes("UTF-8"), "ISO8859-1");
这个是为了下载的时候给的默认文件名可以显示中文,因为UTF-8中的中文浏览器是无法识别的,需要改为ISO8859-1
对应的JSP页面
<%--
Created by IntelliJ IDEA.
User: 52840
Date: 2017/12/11
Time: 17:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<legend>文件上传</legend>
<form action=${pageContext.request.contextPath}/ssm/fileup method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="提交">
</form>
</body>
</html>
明天计划的事情:
完成CRUD以及分页查询
遇到的问题:
遇到了很多坑,这里分享一波.
我在做上传这个页面的时候在controller这里.
@RequestMapping( "/fileup")
//File不能完全描述一个上传的文件.
public String upload(MultipartFile file)throws Exception{
System.out.println(file.getName());//获取表单名字
System.out.println(file.getSize());//获取上传文件的大笑
System.out.println(file.getContentType());//获取到上传文件的类型
System.out.println(file.getOriginalFilename());//获取上传文件的原始名称
//System.out.println(file.getInputStream());//获取到文件的输入流
InputStream is = file.getInputStream();
OutputStream os = new FileOutputStream("E:\\"+file.getOriginalFilename());
IOUtils.copy(is, os);
is.close();
os.close();
return "index";
}
我在欢迎页面直接绑定了这个映射
<a href="${pageContext.request.contextPath}/ssm/fileup">
点击上传文件
</a>
导致点击连接后出500异常.其实我这里就是有问题的.我如果在这里绑定了fileup,在点击这个连接之后就会直接进入到我这个fileup方法里,进入我这个方法就会需要一个MultipartFile对象,但是我这里并没有进入我的上传页面去接收数据,所以我应该另外生成一个方法,用以跳转到我们的上传页面,而由上传页面来绑定这个方法.
这个是Controller里面跳转到上传页面的方法
@RequestMapping("/like")
public String like(){
return "updateFile";
}
修改的欢迎页面绑定
<a href="${pageContext.request.contextPath}/ssm/like">
点击上传文件
</a>
这是我的上传页面
<html>
<head>
<title>Title</title>
</head>
<body>
<legend>文件上传</legend>
<form action=${pageContext.request.contextPath}/ssm/fileup method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="提交">
</form>
</body>
</html>
做页面和Controller交互的时候思维逻辑一定要清晰,不然各种BUG层出不穷.
收获:
学会了如何做简单的页面,传值和接收数据,以及简单的上传和下载,.
评论