SpringMVC JSP
数据的传输及jsp页面展示
1.导入jstl依赖
注意用人多的那个,否则会报错
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2.在jsp头部添加引用jstl的指令
这样就可以在jsp中使用核心标签调用java中的内容
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.使用核心标签
这里和vue.js的v-for有点类似
<c:forEach items="${products}" var="product">
<tr>
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
4.controller层
这里提供不同的三种实现同样功能的方法
//通过使用ModelAndView进行转发传递
@RequestMapping("/allproducts.do")
public ModelAndView getProducts(){
//这部分是模拟使用dao和service层内容
ArrayList<EasybuyProduct> products = new ArrayList<>();
products.add(new EasybuyProduct(1,"康师傅矿泉水",1.0f));
products.add(new EasybuyProduct(2,"百岁山",3.5f));
products.add(new EasybuyProduct(3,"农夫山泉",2.0f));
//实例化视图解析器
ModelAndView mv=new ModelAndView();
mv.addObject("products",products);
mv.setViewName("list");
return mv;
}
//通过request对象来传递参数
@RequestMapping("/all2.do")
public String getProduct2(HttpServletRequest request){
ArrayList<EasybuyProduct> products = new ArrayList<>();
products.add(new EasybuyProduct(1,"康师傅矿泉水",1.0f));
products.add(new EasybuyProduct(2,"百岁山",3.5f));
products.add(new EasybuyProduct(3,"00002",2.0f));
//将数据放到请求对象中
request.setAttribute("products",products);
return "list";
}
//通过使用model传递参数,返回String来进行匹配相应的页面
@RequestMapping("/all3.do")
public String getProduct3(Model m){
ArrayList<EasybuyProduct> products = new ArrayList<>();
products.add(new EasybuyProduct(1,"康师傅矿泉水",1.0f));
products.add(new EasybuyProduct(2,"百岁山",3.5f));
products.add(new EasybuyProduct(3,"00003",2.0f));
//将数据放到请求对象中
m.addAttribute("products",products);
return "list";
}
转发请求与重定向
重定向 | 转发 | |
---|---|---|
request | 会产生新的request对象 | 会将当前的request传递到下一个页面 |
作用位置 | 客户端 | 服务器端 |
url | 会发生变化 | 不变 |
使用情景 | 下一个请求和当前无关 | 当前请求未完成,需要下一个请求接着处理 |
@RequestMapping("/save.do")
public String save(HttpServletRequest request){
System.out.println("转发");
System.out.println("product/save.do");
System.out.println("pid:"+request.getParameter("pid"));
//转发到index.do 将当前的request对象传递给下一个,url不会发生变化
return "forward:/index.do";
}
@RequestMapping("/save2.do")
public String save2(HttpServletRequest request){
System.out.println("重定向");
System.out.println("product/save2.do");
System.out.println("pid:"+request.getParameter("pid"));
//重定向到index.do 会产生新的request对象 url会变成重定向的位置
return "redirect:/index.do";
}
//比较传统的方式
@RequestMapping("/save3.do")
public void save3(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("重定向");
System.out.println("product/save3.do");
System.out.println("pid:" + request.getParameter("pid"));
//重定向
response.sendRedirect("index.do");
//转发
request.getRequestDispatcher("/index.do").forward(request,response);
}
数据的转化JSON
//利用字符串按照JSON的格式强行转化
@RequestMapping("/get.do")
public void getProduct4(int pid,HttpServletResponse response) throws IOException {
EasybuyProduct product = new EasybuyProduct(1,"xxxx",0.2f);
StringBuffer sb= new StringBuffer("{");
sb.append("\"pid\":"+product.getId()+",");
sb.append("\"name\":"+product.getName()+",");
sb.append("\"price\":"+product.getPrice());
sb.append("}");
//通过响应对象向客户端输出内容
response.getWriter().println(sb.toString());
}
//需要引入fastjson依赖包
@RequestMapping("/get2.do")
public @ResponseBody String getProduct5(int pid) throws IOException {
EasybuyProduct product = new EasybuyProduct(1,"xxxx",0.2f);
JSONObject json=new JSONObject();
//和上面的实现了相同的效果
json.put("product",product);
return json.toJSONString();
}
乱码问题的解决
url ,request,response 响应内容 乱码
- tomcat/conf/server.xml 加入 URIEconding=“UTF-8” 重启
- 在RequestMapping加入 @RequestMapping(value = “/get2”, produces = “application/json; charset=utf-8”)
- request.setCharacterEncoding(“utf-8”); response.setCharacterEncoding(“utf-8”);
Session会话对象
- 保持用户访问,实现客户端与服务器之间共享数据,数据存储在服务端
- 客户端–>服务端 多次持续的访问
- 会话结束的情况:
- 关闭浏览器
- 超时
- 利用代码主动失效
- 典型用法就是
- cookie也可以实现类似的功能,数据存放在客户端
//session 将用户信息登录放入session
//获取session对象
HttpSession session = request.getSession();
session.setAttribute("uname",uname);
session.setAttribute("email",email);
session.setAttribute("sessionID",session.getId());
文件上传
1.导入jar包
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.配置解析器
<!-- 文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
3.编写controller处理业务
- 上传文件的流程
- 将文件保存在磁盘上
- 将文件的访问路径存到数据库
@Controller
public class FileuploadController {
private Date date = new Date();
private SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd");
@RequestMapping(value = "/upload.do",method = {RequestMethod.POST},produces = "application/json; charset=utf-8")
public @ResponseBody String upload(@RequestParam(value = "uploadFile") MultipartFile multipartFile, HttpServletRequest request) throws IOException {
String originalFilename = multipartFile.getOriginalFilename();
//用来拼接字符串 拼接状态和信息
HashMap<String,String> resultMap = new HashMap<>();
//判断这个文件是否存在
if(multipartFile==null || originalFilename==null || originalFilename.length()<=0){
resultMap.put("result","false");
resultMap.put("errMsg","上传文件不存在");
return JSONObject.toJSONString(resultMap);
}
//获取文件类型
String subString=getSubFilename(originalFilename);
//判断上传的文件类型是否合法
if(!isLegalSuffix(subString)){
resultMap.put("result","false");
resultMap.put("errMsg","文件上传不合法");
return JSONObject.toJSONString(resultMap);
}
//物理存储路径
String rootPath = request.getServletContext().getRealPath("/");
File upload = new File(rootPath+"upload");
if(!upload.exists()){
upload.mkdir();
}
String savePath = rootPath+"upload\\"+ simpleDateFormat.format(date);
//文件访问的相对路径
String url = "upload/"+simpleDateFormat.format(date)+"/";
//判断目录是否已创建
File mk = new File(savePath);
if(!mk.exists()){
mk.mkdir();
}
//获取新的文件
String newFileName=creatNewFileName(subString);
//实例化文件对象
File newFile = new File(savePath+"\\"+newFileName);
//将文件写入磁盘
multipartFile.transferTo(newFile);
resultMap.put("result","true");
resultMap.put("url",url+newFileName);
return JSONObject.toJSONString(resultMap);
}
//设置合法类型
public boolean isLegalSuffix(String filename){
String substring = filename.substring(filename.lastIndexOf(".") + 1);
String[] legalSuffixs= {"jpg","png","gif"};
for (String suffix:legalSuffixs) {
if(suffix.equalsIgnoreCase(substring))
return true;
}
return false;
}
//获取文件名后缀
public String getSubFilename(String filename){
String substring = filename.substring(filename.lastIndexOf(".") + 1);
return substring;
}
//组合文件名
public String creatNewFileName(String substring){
String fileName=System.currentTimeMillis()+"."+substring;
return fileName;
}
}