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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>编程帮(www.biancheng.net)</title>
</head>
<body>
<%
pageContext.setAttribute("info", "page属性范围");
request.setAttribute("info", "request属性范围");
session.setAttribute("info", "session属性范围");
application.setAttribute("info", "application属性范围");
%>
<h2>不同属性范围的值</h2>
<hr />
不指定范围:${info}
<br> page 属性内容:${pageScope.info}
<br> request 属性内容:${requestScope.info}
<br>session 属性内容:${sessionScope.info}
<br>application 属性内容:${applicationScope.info}
</body>
</html>

jstl标签很多,笔记一下我常用到的标签

if

语法:

1
2
3
4
5
<c:if test="${one.name eq 'nick'}">
<tr>
<td>nick</td>
</tr>
</c:if>

java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp


完整的异常信息如下:

1
2
3
4
5
6
7
8
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
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy127.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy134.findOrderInfo(Unknown Source)

根据异常信息,大概意思是说,‘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
2
3
<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
参数值
</foreach>

foreach 标签主要有以下属性,说明如下。

  • item:表示集合中每一个元素进行迭代时的别名。
  • index:指定一个名字,表示在迭代过程中每次迭代到的位置。
  • open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
  • separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
  • close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。

使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的.

WebsiteMapper.xml 中代码如下。

1
2
3
4
5
6
7
8
9
10
<select id="selectWebsite"
parameterType="net.biancheng.po.Website"
resultType="net.biancheng.po.Website">
SELECT id,name,url,age,country
FROM website WHERE age in
<foreach item="age" index="index" collection="list" open="("
separator="," close=")">
#{age}
</foreach>
</select>

WebsiteMapper 类中相应方法如下。

1
public List<Website> selectWebsite(List<Integer> ageList);

MyBatis分布查询

association 分步查询

  1. 先通过员工的id查询员工信息

  2. 再通过查询出来的员工信息中的外键(部门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
2
3
<association property="studentCard" column="cardId"
javaType="net.biancheng.po.StudentCard"
select="net.biancheng.mapper.StudentCardMapper.selectStuCardById" />

元素中通常使用以下属性。

  • 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
    4
    var 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
    21
    function 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
    10
    var 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
    7
    xhr.onreadystatechange = function () {
    // 当readyStatew为4,且状态码为200时代表请求成功
    if (xhr.readyState === 4 && xhr.status === 200) {
    // 处理响应值
    document.write(xhr.responseText);
    }
    }

使用js操作checkbox

使用原生JavaScript判断是否选中checkbox框

1
2
3
4
5
6
7
<input type="checkbox" id="test" class="test">同意
<script>
// 获取checkbox元素
var box=document.getElementById("test");
// 判断是否被拒选中,选中返回true,未选中返回false
alert(box.checked);
</script>

javascript怎么实现页面跳转

  1. 使用“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>
  2. 使用“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>
  3. 使用“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>
  4. 使用“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中相对路径写法

  1. “…/” 表示上一级目录开始;
  2. “./” 表示同级目录开始
  3. “/” 表示根目录开始

JS中对象与数组(大括号{}与中括号[])

  1. { } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.

  2. [ ]中括号,表示一个数组,也可以理解为一个数组对象。

  3. { } 和[ ] 一起使用,我们前面说到,{ } 是一个对象,[ ] 是一个数组,我们可以组成一个对象数组

    对象的属性名可以为数字,但是不能正常读取,可以以数组下标形式读取。


JS创建对象(3种方式)

  1. 构造对象

    使用 new 运算符调用构造函数,可以构造一个实例对象。具体用法如下:

    1
    var objectName = new functionName(args);
  2. 对象直接量

    使用直接量可以快速创建对象,也是最高效、最简便的方法。具体用法如下:

    1
    2
    3
    4
    5
    6
    var objectName = {
    属性名1 : 属性值1,
    属性名2 : 属性值2,
    ...
    属性名n : 属性值n
    };

    示例1

    下面代码使用对象直接量定义两个对象。

    1
    2
    3
    4
    5
    6
    7
    8
    var o = {  //对象直接量
    a : 1, //定义属性
    b : true //定义属性
    }
    var o1 = { //对象直接量
    "a" : 1, //定义属性
    "b" : true //定义属性
    }

    示例2

    如果不包含任何属性,则可以定义一个空对象。

    1
    var o = {}  //定义一个空对象直接量
  3. 使用 Object.create

    Object.create 是 ECMAScript 5 新增的一个静态方法,用来创建一个实例对象。该方法可以指定对象的原型和对象特性。具体用法如下:

    1
    Object.create(prototype, descriptors)

数组对象中每个对象添加一个字段

使用Array forEach()方法

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

  1. currentValue 必须。当前元素的值

  2. index 可选。当前元素的索引值

  3. index 可选。当前元素属于的数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let 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循环)

  1. 使用 for 和 for in遍历数组

    下面示例使用 for 语句迭代数组,过滤出所有数字元素。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var 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
    8
    var b = [], num = 0;
    for (var i in a) { //遍历数组
    iftypeof a[i] == "number") //如果为数字,则返回该元素的值
    b.push(a[i]);
    num ++; //计数器
    }
    console.log(num); //返回7,说明循环了7次
    console.log(b); //返回[1,2,4,56]
  2. 使用 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
    5
    function f(value,index,array) {
    console.log("a[" + index + "] = " + value);
    }
    var a = ['a', 'b', 'c'];
    a.forEach(f);

js-清空array数组

  1. 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>
  2. 赋值为[]

    1
    2
    var ary = [1,2,3,4];
    ary = []; // 赋值为一个空数组以达到清空原数组

Layui相关问题

Layui中弹出层关闭后但是弹出层中的内容依然显示在页面上,没有消失

原因:jquery 冲突
解决方法:将你html页面引入的jquery删掉,直接使用layui内置的jquery

  1. 删除页面引入的jquery

  2. 使用layui自带的jquery


Layui form 表单验证lay-verify的使用

lay-verify:表单验证的关键字有以下值供选择:

  1. required (必填项)
  2. phone(手机号)
  3. email(邮箱)
  4. url(网址)
  5. number(数字)
  6. date(日期)
  7. identify(身份证)

layui支持多条规则的验证:格式:lay-verify=”验证1|验证2” 如:lay-verify=”required|phone|number”

自定义验证 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
密码:<input id="password" class="lauui-input"></input>
确认密码:<input class="lauui-input" lay-verify="required|pwd"></input>



//form自定义验证

form.verify({
//密码的验证
pwd: function (value) {
debugger
var pwd = $('#password').val();
if(pwd !=value){
return "两次输入密码不一致";
}
},
});

layui Form禁止编辑

  1. 设置样式,鼠标点击输入框出现禁用图标(不可编辑,不可复制,不可选择,不能接收焦点)

    1
    class="layui-disabled"
  2. 通过设置disabled属性实现:

    1
    <input class="layui-input" disabled>

使用layui框架时select监听的那些坑:无法监听change事件

layui框架对select表单代码又进行了二次渲柒,所以无法使用普通的监听。

那要怎么监听呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<select lay-filter="demo">
<option>......</option>
</select>

<script>
layui.use(['layer', 'jquery', 'form'], function () {
var layer = layui.layer,
$ = layui.jquery,
form = layui.form;

form.on('select(demo)', function(data){
//这里做自己想做的事情
console.log(data.elem); //得到select原始DOM对象
console.log(data.value); //得到被选中的值
console.log(data.othis); //得到美化后的DOM对象
//最后再渲柒一次
form.render('select');//select是固定写法 不是选择器
});
});
</script>

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
layui.use('layer', function () {

var layer = layui.layer;

layer.open({
skin: 'demo-class',
type: 1,
title: '登录',
area: ['600px', '700px'],
closeBtn :0,
content: $('.login'), //这里content是一个普通的String
cancel: function () {
vscode.postMessage({
command: 'close'
});
}
});
});

HTTP相关问题

HTTP 状态码

下面是常见的 HTTP 状态码:

  1. 200 - 请求成功
  2. 301 - 资源(网页等)被永久转移到其它URL
  3. 404 - 请求的资源(网页等)不存在
  4. 500 - 内部服务器错误

Eclipse使用相关问题

Eclipse添加GBK编码

首先Windows->Preferences, 然后选择General下面的Workspace. Text file encoding选择Other GBK, 如果没有GBK的选项, 没关系, 直接输入GBK三个字母, Apply, GBK编码的中文, 已经不是乱码了


JAVAWEB相关问题

JavaWeb——转发和重定向

  1. 转发和重定向的比较:

    比较内容 转发 重定向
    浏览器发送请求的次数 1 2
    发生的位置 服务器 浏览器
    地址栏变化 不发生变化 发生改变
    浏览器感知 无感知 有感知
  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
2
3
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
HttpSession session=attr.getRequest().getSession(true);
UserModel user = (UserModel)session.getAttribute("loginUser");