crm项目相关问题
SSM框架中应用el和jstl
el即Expression Language,用来在jsp页面上显示内容,jstl是JSP Standard Tag Library的缩写,包含多种标签,el和jstl结合使用,页面渲染更方便。
EL内置对象
内置对象 | 说明 |
---|---|
pageScope | 获取 page 范围的变量 |
requestScope | 获取 request 范围的变量 |
sessionScope | 获取 session 范围的变量 |
applicationScope | 获取 application 范围的变量 |
param | 相当于 request.getParameter(String name),获取单个参数的值 |
paramValues | 相当于 request.getParameterValues(String name),获取参数集合中的变量值 |
header | 相当于 request.getHeader(String name),获取 HTTP 请求头信息 |
headerValues | 相当于 request.getHeaders(String name),获取 HTTP 请求头数组信息 |
initParam | 相当于 application.getInitParameter(String name),获取 web.xml 文件中的参数值 |
cookie | 相当于 request.getCookies(),获取 cookie 中的值 |
pageContext | 表示当前 JSP 页面的 pageContext 对象 |
EL 表达式获取 4 种不同范围的属性,代码如下:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
jstl标签很多,笔记一下我常用到的标签
if
语法:
1 | <c:if test="${one.name eq 'nick'}"> |
java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
完整的异常信息如下:
1 | org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'audit_time' from result set. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'audit_time' from result set. Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp |
根据异常信息,大概意思是说,‘0000-00-00 00:00:00’ 这个时间不能用 Java 来表示。虽然数据库中可以存放这个值,但是 Java 中的时间都是从 1970 年开始的。格林威治时间 1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒),所以你这个 ‘0000-00-00 00:00:00’ 的时间,Java 表示不了,所以就抛出了这个异常。
可以使用下面的方式连接数据库来解决:
根据 stackoverflow 上一部分人的回答,我得出可以使用下面的方式连接数据库来解决:
jdbc:mysql:``//www.xttblog.com:3306/xttblog?zeroDateTimeBehavior=convertToNull
Matis相关问题
Mybatis中的resultType和resultMap
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
MyBatis foreach标签
语法格式如下。
1 | <foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")"> |
foreach 标签主要有以下属性,说明如下。
- item:表示集合中每一个元素进行迭代时的别名。
- index:指定一个名字,表示在迭代过程中每次迭代到的位置。
- open:表示该语句以什么开始(既然是 in 条件语句,所以必然以
(
开始)。 - separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以
,
作为分隔符)。 - close:表示该语句以什么结束(既然是 in 条件语句,所以必然以
)
开始)。
使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的.
WebsiteMapper.xml 中代码如下。
1 | <select id="selectWebsite" |
WebsiteMapper 类中相应方法如下。
1 | public List<Website> selectWebsite(List<Integer> ageList); |
MyBatis分布查询
association 分步查询
-
先通过员工的id查询员工信息
-
再通过查询出来的员工信息中的外键(部门id)查询对应的部门信息.
1
2
3
4
5
6
7
8
9
10
11
12
13<select id="getEmployeeAndDeptStep" resultMap="myEmpAndDeptStep">
select id, last_name, email,gender,d_id from tbl_employee where id =#{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Employee" id="myEmpAndDeptStep">
<id column="id" property="id" />
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<association property="dept" select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById"
column="d_id">
</association>
</resultMap>
mybatis在xml文件中处理大于号小于号的方法
因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用符号进行说明,将此类符号不进行解析
你的可以写成这个:
mapper文件示例代码
1 | <![CDATA[ when min(starttime)<='12:00' and max(endtime)<='12:00' ]]> |
MyBatis一对一关联查询
在 MyBatis 中,通过
1 | <association property="studentCard" column="cardId" |
在
- property:指定映射到实体类的对象属性。
- column:指定表中对应的字段(即查询返回的列名)。
- javaType:指定映射到实体对象属性的类型。
- select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。
JS相关问题
JS ajax提交form表单
通用处理
在使用 Ajax 提交 form 表单时,需要对 form 表单进行特殊的处理,包括以下几点:
- 将 form 标签的 action 属性和 method 属性去掉。
- 将提交 form 表单按钮的 type=“submit” 改为 type=“button”。
使用原生 Ajax 提交 form 表单包含以下过程:
-
绑定提交按钮事件。
在单击提交按钮时,触发 Ajax 请求的操作,将整个 Ajax 操作封装在 ajaxSubmitForm() 函数里。
1
2
3
4var submitBtn = document.getElementById('submit');
submitBtn.addEventListener('click', function () {
ajaxSubmitForm();
}); -
创建 XMLHttpRequest 对象。
XMLHttpRequest 对象的创建直接使用封装的函数即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21function createXMLHttp() {
// code for IE7+, Firefox, Chrome, Opera, Safari
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
// code for IE6, IE5
if (window.ActiveXObject) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
try {
xmlhttp = new ActiveXObject("msxml2.XMLHTTP");
}
catch (ex) { }
}
}
return xmlhttp;
}
var xhr = createXMLHttp() -
建立连接。
本实例可以理解为一个用户的注册操作,发送的请求为 POST 请求,使用异步处理的方式。
1
xhr.open('post', '/saveUser', true);
-
设置请求头。
由于本实例中发送的是 POST 请求,需要设置数据传输格式,即设置 Content-type 属性值。可以通过 setRequestHeader() 函数对其进行设置,将其值设置为比较普遍的 JSON 数据格式。
1
xhr.setRequestHeader('Content-type', 'application/json;charset=UTF-8');
-
获取数据。
1
2
3
4
5
6
7
8
9
10var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
var telphone = document.getElementById('telphone').value;
var email = document.getElementById('email').value;
var content = {
username: username,
password: password,
telphone: telphone,
email: email
};因为在请求头中设置了数据传输格式为 json,所以需要将 content 对象处理为 json 字符串。
1
content = JSON.stringify(content);
-
发送请求。
1
xhr.send(content);
-
处理响应。
设置 onreadystatechange 属性对应的回调函数
1
2
3
4
5
6
7xhr.onreadystatechange = function () {
// 当readyStatew为4,且状态码为200时代表请求成功
if (xhr.readyState === 4 && xhr.status === 200) {
// 处理响应值
document.write(xhr.responseText);
}
}
使用js操作checkbox
使用原生JavaScript判断是否选中checkbox框
1 | <input type="checkbox" id="test" class="test">同意 |
javascript怎么实现页面跳转
-
使用“location.href=“URL””;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p>这是<i>location.href</i>方式的示例</p>
<button onclick="myFunc()">点击这里</button>
<!--重定向到其他网页的脚本-->
<script>
function myFunc() {
window.location.href="https://www.php.cn";
}
</script>
</body>
</html> -
使用“location.replace(“URL”)”;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p>这是<i>location.replace()</i>方式的示例</p>
<button onclick="myFunc()">点击这里</button>
<!--重定向到其他网页的脚本-->
<script>
function myFunc() {
location.replace("https://www.php.cn");
}
</script>
</body>
</html> -
使用“location.assign(“URL”)”;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p>这是<i>location.assign()</i>方式的示例</p>
<button onclick="myFunc()">点击这里</button>
<!--重定向到其他网页的脚本-->
<script>
function myFunc() {
location.assign("https://www.php.cn");
}
</script>
</body>
</html> -
使用“window.open(“URL”)”;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p>这是<i>window.open()</i>方式的示例</p>
<button onclick="myFunc()">点击这里</button>
<!--重定向到其他网页的脚本-->
<script>
function myFunc() {
window.open("https://www.php.cn");
}
</script>
</body>
</html>
js中相对路径写法
- “…/” 表示上一级目录开始;
- “./” 表示同级目录开始
- “/” 表示根目录开始
JS中对象与数组(大括号{}与中括号[])
-
{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.
-
[ ]中括号,表示一个数组,也可以理解为一个数组对象。
-
{ } 和[ ] 一起使用,我们前面说到,{ } 是一个对象,[ ] 是一个数组,我们可以组成一个对象数组
对象的属性名可以为数字,但是不能正常读取,可以以数组下标形式读取。
JS创建对象(3种方式)
-
构造对象
使用 new 运算符调用构造函数,可以构造一个实例对象。具体用法如下:
1
var objectName = new functionName(args);
-
对象直接量
使用直接量可以快速创建对象,也是最高效、最简便的方法。具体用法如下:
1
2
3
4
5
6var objectName = {
属性名1 : 属性值1,
属性名2 : 属性值2,
...
属性名n : 属性值n
};示例1
下面代码使用对象直接量定义两个对象。
1
2
3
4
5
6
7
8var o = { //对象直接量
a : 1, //定义属性
b : true //定义属性
}
var o1 = { //对象直接量
"a" : 1, //定义属性
"b" : true //定义属性
}示例2
如果不包含任何属性,则可以定义一个空对象。
1
var o = {} //定义一个空对象直接量
-
使用 Object.create
Object.create 是 ECMAScript 5 新增的一个静态方法,用来创建一个实例对象。该方法可以指定对象的原型和对象特性。具体用法如下:
1
Object.create(prototype, descriptors)
数组对象中每个对象添加一个字段
使用Array forEach()方法
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
-
currentValue 必须。当前元素的值
-
index 可选。当前元素的索引值
-
index 可选。当前元素属于的数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14let arr = [
{name: 'lilei',age: '25'},
{name: 'nike',age: '23'},
{name: 'alisa',age: '23'}
]
arr.forEach((value , index) => {
value['sex'] = 'men'
})
// 返回原数组arr
[
{name: 'lilei',age: '25',sex: 'men'},
{name: 'nike',age: '23',sex: 'men'},
{name: 'alisa',age: '23',sex: 'men'}
]
JS遍历数组(for in和forEach循环)
-
使用 for 和 for in遍历数组
下面示例使用 for 语句迭代数组,过滤出所有数字元素。
1
2
3
4
5
6
7
8
9var a = [1, 2, ,,,,,,true,,,,,,, "a",,,,,,,,,,,,,,,4,,,,,56,,,,,,"b"]; //定义数组
var b = [], num = 0;
for (var i = 0; i < a.length; i ++) { //遍历数组
if (typeof a[i] == "number") //如果为数字,则返回该元素的值
b.push(a[i]);
num ++; //计数器
}
console.log(num); //返回42,说明循环了42次
console.log(b); //返回[1,2,4,56]下面代码使用 for/in 语句迭代示例 1 中的数组 a。在 for/in 循环结构中,变量 i 表示数组的下标,而 a[i] 为可以读取指定下标的元素值。
1
2
3
4
5
6
7
8var b = [], num = 0;
for (var i in a) { //遍历数组
if(typeof a[i] == "number") //如果为数字,则返回该元素的值
b.push(a[i]);
num ++; //计数器
}
console.log(num); //返回7,说明循环了7次
console.log(b); //返回[1,2,4,56] -
使用 forEach 遍历数组
Array 类型为每个数组定义了 forEach() 原型方法,使用该方法可以为数组执行迭代操作。具体说明如下:
1
array.forEach(callbackfn[, thisArg]);
参数说明如下:
- array:一个数组对象。
- callbackfn:必需参数,最多可以接收三个参数的函数。forEach 将为数组中的每个元素调用 callbackfn 函数一次。
- thisArg:可选参数,callbackfn 函数中的 this 可引用的对象。如果省略 thisArg,则 this 的值为 undefined。
回调函数语法如下:
1
funtion callbackfn(value, index, array);
最多可以使用三个参数来声明回调函数。回调函数的参数说明如下。
- value:数组元素的值。
- index:数组元素的数字索引。
- array:包含该元素的数组对象。
下面示例使用 forEach 迭代数组 a,然后把每个元素的值和下标索引输出显示,代码如下:
1
2
3
4
5function f(value,index,array) {
console.log("a[" + index + "] = " + value);
}
var a = ['a', 'b', 'c'];
a.forEach(f);
js-清空array数组
-
splice
删除元素并添加新元素,直接对数组进行修改,返回含有被删除元素的数组。
1
arrayObject.splice(index,howmany,element1,.....,elementX)
index:必选,规定从何处添加/删除元素。
howmany:必选,规定应该删除多少元素。未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
element1:可选,规定要添加到数组的新元素。
Js代码
1
2
3
4
5<script type ="text/javascript">
var arr = [1,2,3,4];
arr.splice(0,arr.length);
document.write(arr);
</script> -
赋值为[]
1
2var ary = [1,2,3,4];
ary = []; // 赋值为一个空数组以达到清空原数组
Layui相关问题
Layui中弹出层关闭后但是弹出层中的内容依然显示在页面上,没有消失
原因:jquery 冲突
解决方法:将你html页面引入的jquery删掉,直接使用layui内置的jquery
-
删除页面引入的jquery
-
使用layui自带的jquery
Layui form 表单验证lay-verify的使用
lay-verify:表单验证的关键字有以下值供选择:
- required (必填项)
- phone(手机号)
- email(邮箱)
- url(网址)
- number(数字)
- date(日期)
- identify(身份证)
layui支持多条规则的验证:格式:lay-verify=”验证1|验证2” 如:lay-verify=”required|phone|number”
自定义验证 :
1 | 密码:<input id="password" class="lauui-input"></input> |
layui Form禁止编辑
-
设置样式,鼠标点击输入框出现禁用图标(不可编辑,不可复制,不可选择,不能接收焦点)
1
class="layui-disabled"
-
通过设置disabled属性实现:
1
<input class="layui-input" disabled>
使用layui框架时select监听的那些坑:无法监听change事件
layui框架对select表单代码又进行了二次渲柒,所以无法使用普通的监听。
那要怎么监听呢?
1 |
|
Layui按钮动态设置禁用与取消禁用
按钮:
1 | <button class="layui-btn layui-btn-sm" lay-filter="formDemo" type="submit" id="formDemo" lay-submit="">保存</button> |
禁用按钮:
1 | $('#formDemo').attr("disabled",true).addClass("layui-btn-disabled"); |
取消禁用按钮:
1 | $('#formDemo').attr("disabled",false).removeClass("layui-btn-disabled"); |
layui如何自定义弹出层关闭事件
代码示例如下:
1 | layui.use('layer', function () { |
HTTP相关问题
HTTP 状态码
下面是常见的 HTTP 状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
Eclipse使用相关问题
Eclipse添加GBK编码
首先Windows->Preferences, 然后选择General下面的Workspace. Text file encoding选择Other GBK, 如果没有GBK的选项, 没关系, 直接输入GBK三个字母, Apply, GBK编码的中文, 已经不是乱码了
JAVAWEB相关问题
JavaWeb——转发和重定向
-
转发和重定向的比较:
比较内容 转发 重定向 浏览器发送请求的次数 1 2 发生的位置 服务器 浏览器 地址栏变化 不发生变化 发生改变 浏览器感知 无感知 有感知 -
示例代码:
1
2
3
4//转发
request.getRequestDispatcher("login-success.html").forward(request,response);
//重定向
response.sendRedirect("login-error.html");
用Java来获取访问者真实的IP地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr()
SpringAOP相关问题
Spring AOP中获取session方法
1 | ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes(); |