天天看点

暑期实习Day8---SpringMVCSpringMVC JSP

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;
    }
    
    
}
           

继续阅读