天天看點

暑期實習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;
    }
    
    
}
           

繼續閱讀