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