# SSM **Repository Path**: summer-rush/ssm ## Basic Information - **Project Name**: SSM - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-11 - **Last Updated**: 2021-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 项目开发学习笔记 ### 一、将一个类声明为 bean 的注解有哪些? 我们一般使用 @Autowired 注解自动装配bean,要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,采用以下注解可实现: - @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。 - @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。 - @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 - @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。 ### 二、SpringMVC作用域传值方式有哪些? #### 1.使用原生 Servlet 在 HanlderMethod 参数中添加作用域对象 ```java @RequestMapping("demo1") public String demo1(HttpServletRequest request, HttpSession sessionParam) { //request 作用域 request.setAttribute("req", "req 的值"); //session 作用域 HttpSession session = request.getSession(); session.setAttribute("session", "session 的值"); sessionParam.setAttribute("sessionParam", "sessionParam 的值"); //application 作用域 ServletContext application = request.getSession().getServletContext(); application.setAttribute("application", "application 的值"); return "/index.jsp"; } ``` #### 2.使用Map集合 1. 把 map 中内容放在 request 作用域中。 2. spring 会对 map 集合通过 BindingAwareModelMap 进行实例化。 ```java @RequestMapping("demo2") public String demo2(Map map){ System.out.println(map.getClass()); map.put("map","map 的值"); return "/index.jsp"; } ``` #### 3.使用 SpringMVC 中 Model 接口 把内容最终放入到 request 作用域中. ```kotlin @RequestMapping("demo3") public String demo3(Model model) { model.addAttribute("model", "model 的值"); return "/index.jsp"; } ``` #### 4.使用 SpringMVC 中 ModelAndView 类 ```java @RequestMapping("demo4") public demo4() { //参数,跳转视图 ModelAndView mav = new ModelAndView("/index.jsp"); mav.addObject("mav", "mav 的值"); return mav; } ``` ### 三、SpringMVC之文件上传 1. ###### 基于 apache 的 commons-fileupload.jar 完成文件上传. 2. ###### MultipartResovler作用: 2.1 把客户端上传的文件流转换成 MutipartFile 封装类. 2.2 通过 MutipartFile 封装类获取到文件流 3. ###### 表单数据类型分类 3.1 在
的 enctype 属性控制表单类型 3.2 默认值 application/x-www-form-urlencoded,普通表单数据.(少 量文字信息) 3.3 text/plain 大文字量时使用的类型.邮件,论文 3.4 multipart/form-data 表单中包含二进制文件内容. 4. ###### 实现步骤: 4.1 导入 springmvc 包和 apache 文件上传 commons-fileupload 和 commons-io 两个 jar 4.2 编写 JSP 页面 ```jsp 姓名:
文件:
``` ​ 4.3 配置 springmvc.xml ```xml /error.jsp ``` ​ 4.4 编写控制器类 ​ 4.4.1 MultipartFile 对象名必须和的 name 属性值相同 ```tsx @RequestMapping("upload") public String upload(MultipartFile file, String name) throws IOException { String fileName = file.getOriginalFilename(); String suffix = fileName.substring(fileName.lastIndexOf(".")); //判断上传文件类型 if (suffix.equalsIgnoreCase(".png")) { String uuid = UUID.randomUUID().toString(); FileUtils.copyInputStreamToFile(file.getInputStream(), new File("E:/" + uuid + suffix)); return "/index.jsp"; } else { return "error.jsp"; } } ``` ------ ### 四、bootstrap的简介。 `Bootstrap`,来自 `Twitter`,是目前全球最受欢迎的前端框架。 `bootstrap`下载及演示 http://v3.bootcss.com 什么是`bootstrap`? - `Bootstrap`是基于 `HTML`、`CSS`、`JAVASCRIPT` 的开源框架,它简洁、直观、强悍、灵活,使得 `Web`开发更加快捷, - 用于开发响应式布局、移动设备优先的 `WEB`项目。 为什么使用 `Bootstrap`? - 跨设备 - 跨浏览器(`chrome`,`IE9`以上,`Firefox`,`Safari`,`Opera`...) - 响应式布局 - 具有实用性强的组件 - 内置`jquery`插件 `bootstrap`的结构 - 主要分为三大核心模块:`css`、`js`、`font` ### 五、URL - 统一资源定位器 Web浏览器通过URL从Web服务器请求页面。 当您点击 HTML 页面中的某个链接时,对应的 标签指向万维网上的一个地址。 一个统一资源定位器(URL) 用于定位万维网上的文档。 一个网页地址实例: http://www.runoob.com/html/html-tutorial.html 语法规则: **scheme`://`host.domain`:`port`/`path`/`filename** 说明: - - scheme - 定义因特网服务的类型。最常见的类型是 http - host - 定义域主机(http 的默认主机是 www) - domain - 定义因特网域名,比如 runoob.com - :port - 定义主机上的端口号(http 的默认端口号是 80) - path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。 - filename - 定义文档/资源的名称 ### 六、前端url传递参数编码问题 使用这种方式传参时,参数需接在url后面,并且用?分隔.如果有多个参数,各参数间用 & 连接。get方式请求时可以使用URL方式传参。 ``` Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21"); ``` | ASCII 字符 | URL-编码 | | :--------- | :------- | | space | %20 | | ! | %21 | | " | %22 | | # | %23 | | $ | %24 | | % | %25 | | & | %26 | | ' | %27 | | ( | %28 | | ) | %29 | | * | %2A | | + | %2B | | , | %2C | | - | %2D | | . | %2E | | / | %2F | ### 七、Jsp中form表单提交几种方式 #### 1.按钮方式提交 ```jsp
``` 这种方式是最传统的提交表单的方式,就是把所有的表单的值传到url界面。用于本页面传本页面比较多。 #### 2.onclick触发js事件 ```jsp ``` 这里是通过onclick触发js事件,然后我们可以在function onSubmit(){}写一些传输方式,比较典型的就是ajax传输: ```js function onSubmit() { $.ajax({ type: "get", url: "fix_project_contrast_do.jsp", data: { fixitem_id: j$("#fixitem_id").val(), check_man: j$("#check_man").val() }, success: function (ret) { if (ret == 1) { alert("提交审核成功!"); } else { alert(ret); } window.returnValue = true; window.close(); } }); } ``` 然后我们可以在fix_project_contrast_do.jsp处理。 ```jsp <%@ page contentType="text/html; charset=GBK" import="相应的类路径" %> <% try { Integer fixitem_id = Utility.trimNull(request.getParameter("fixitem_id")), new Integer(0)); Integer check_man = Utility.parseInt(Utility.trimNull(request.getParameter("check_man")), new Integer(0)); //处理逻辑省略 out.clear(); response.getWriter().write("1");//response相应值 } catch (Exception e) { out.clear(); response.getWriter().write(e.getMessage()); } %> ``` 这种ajax异步传输用于修改后保存然后刷新页面比较多。 **扩展:** 如果我上传的页面包含的时候,需要修改在我们form标签 ```
``` 我们就要通过下面代码提交表单了,fileElementId:'form_name'是提交form_name整个表单。 ```js jQuery.ajaxFileUpload({ async:false, url:'fix_project_contrast_do.jsp', secureuri:false, fileElementId:'form_name', dataType: 'json', beforeSend:function(){ }, complete:function(){ }, success: function (data, status){ //表单参数 //次顺序 alert("保存成功"); window.location.reload();//刷新 }, error: function (data, status, e){ var result = Ext.MessageBox.show({ title: '事务表单异常', msg: data.responseText, width:520, closable:false }); } }); } ``` 然后在fix_project_contrast_do.jsp接收数据的数据需要如下操作 ```   Integer fixitem_id = Utility.trimNull(file.getParameter("fixitem_id")), new Integer(0)); ``` #### 3.通过Jsp中嵌套Java代码 ```html
``` 使用java代码实现相应的业务代码。 ```jsp <% if (request.getMethod().equals("POST")) { /**逻辑代码 *1.获取参数 *2.处理参数,实现业务逻辑 *3.设置标识,用于通过js跳转页面或刷新页面 */ bSuccess = true; } %> <%if (bSuccess) {%> alert("保存成功!"); var url = "对应的url参数"; location = url; <%} %> ``` #### 4.异步传输,实时监控表单数据 ```Javascript ``` #### 5.$.post()提交表单,$.ajax的封装 其原理和$.ajax一样。需要导入.jquery.js包 ``` js$.post("problem_invest_use_money_getCustInfo.jsp", {"fixitem_id" : fixitem_id}, function(data){ if(data != 0){ var params = data.split("$"); if(params[0] == 1){ document.getElementById("jkr_cust_id").value = params[1]; document.getElementById("jkr_cust_name").value = params[2]; }else{ alert(data) } } }); ``` 其中回调函数data就是通过java代码:response.getWriter().write(returnString);返回 #### 6.showModalDialog返回获取放回字符串 ```js function btnChoose(){ if(!sl_checkChoice(document.theform.fixitem_id, "项目ID")) return false; if(!sl_checkChoice(document.theform.jj_contract_sub_bh, "合同编号")) return false; var fixitem_id = document.getElementById("fixitem_id").value; var jj_contract_bh = document.getElementById("jj_contract_sub_bh").value; var v = showModalDialog('/efifs/zhongjiantou/repayment_principal_plan_choose.jsp?fixitem_id='+fixitem_id+'&jj_contract_bh='+jj_contract_bh,'','dialogWidth=1000px;dialogHeight=800px;status=no;help=0'); var params = v.split("$"); document.getElementById("money").value = params[0]; document.getElementById("lx_money").value = params[1]; document.getElementById("plan_id_list").value = params[2]; ``` 其中 v = window.returnValue = returnString;