【前端JSP思考】JSP中#{},${}和%{}的区别
JSP中#{},${}和%{}的区别:
#{}
#{}:对语句进行预编译,此语句解析的是占位符?,可以防止SQL注入, 比如打印出来的语句 select * from table where id=?,预编译之后会变成select * from table where id = "1 or 1 = 1"。给注入信息加上了引号,并将其中可能存在的特殊字符进行了转义处理,替换掉了,所以可以防止注入。
类比:Java中的PreparedStatement
预编译:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。例如,C语言的宏定义
#define pi 3.14,就是在编译前把对应的变量替换掉了。
我们这里的SQL预编译,PreparedStatement不是将参数简单拼凑成SQL,而是做了一些预处理,将参数转换为String,两端加单引号,将参数内的一些特殊字符(换行,单双引号,斜杠等)做转义处理,这样就很大限度的避免了SQL注入。
Statement:${}
如 对于查询语句:select * from user where name='+ name +'
输入:张三' or 1 = '1
Statement,单纯拼接,不防止注入:select * from user where name = '张三' or 1 = '1'
PreparedStatement:#{}
对于查询语句:select * from user where name=?
PreparedStatement,预编译SQL,对参数进行转义,防止注入,select * from user where name = '张三' or 1 = '1'
这样可以防止注入,导致我们sql语句的结构被改变。
${}
${}:则是不能防止SQL注入打印出来的语句 select * from table where id=2 实实在在的参数拼接而成,可能会被注入select * from table where id = 1 or 1 = 1。
类比:Java中的Statement
%{}
%{}:用在ognl表达式中是保证'{' 和 '}'之间的内容是OGNL表达式取值方式的
ognl表达式 即 对象导航图语言,用点来代替getset方法的调用,如配置文件properties中的. 。
如setName 我们可以使用.name
相当于oc中的点方法
@{}
在Thymeleaf中又引入了一个新的表达式符号@{},@{}代表获取上下文,也可以理解为获取当前项目的根目录。
Jsp 的老方法${pageContext.request.contextPath} = Thymeleaf 的新方式 @{}
如下实例
老式jsp:
<div style="border: solid 1px">
<form enctype="multipart/form-data" method="post" th:action= "${pageContext.request.contextPath}/uploadDownload/testuploadimg">
图片<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</div>
新的thymeleaf:
<div style="border: solid 1px">
<form enctype="multipart/form-data" method="post" th:action= "@{/uploadDownload/testuploadimg}">
图片<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</div>
{{}}
在vue中又引入了一个新的表达式符号{{}},{{}}用于输出对象属性和函数返回值,与${}用法类似,只不过{{}}是用于输出vue对象的属性和返回值
var vm = new Vue({
/* el:用于绑定属性的元素 */
el:"#app", //
//data 用于定义属性,
data:{
msg:"hello world!!",
age: 30,
firstName : "liu234",
lastName : "luw3111i",
fullName : "luwei 6"
},
/* 用于定义的函数,可以通过 return 来返回函数值。*/
methods : {
getFullName : function(){
//this指vm实例
return this.firstName + "" + this.lastName
}
}
})
【前端JSP思考】JSP中#{},${}和%{}的区别的更多相关文章
- jsp中两种include的区别【转】
引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...
- <%@page include%>、<%@include%>、<jsp:include>三者之间的本质区别
<%@page include%>.<%@include%>.<jsp:include>三者之间的本质区别 先从它的几个内置对象说起. application和se ...
- jsp中forward和redirect的区别(转)
一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下: request.getRequestDispatcher("new.jsp").forward(reques ...
- JSP的getRequestDispatcher()与sendRedirect()的区别
getRequestDispatcher()与sendRedirect()的区别 1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ; r ...
- 网站开发进阶(六)JSP两种声明变量的区别
JSP两种声明变量的区别 在JSP中用两种声明变量的方法,一种是在<%! %>内,一种是在<% %>内.他们之间有什么区别呢?我们直接看一个JSP文件来理解. 代码如下: &l ...
- jsp中jsp:forward 与 redirect区别
部分转载:http://hi.baidu.com/168zlf/item/2f4b2ad4351b881c20e2500c 在网上看到一些帖子,总结了一些区别,可以从以下几个方面来看: 1.从地址栏显 ...
- jsp页面中注释 <!-- --> 和<%-- --%> 的区别
jsp页面中注释 <!-- --> 和<%-- --%> 的区别 原创 2016年09月01日 17:55:44 标签: jsp注释 5605 今天发现一个问题:在jsp代码中 ...
- <jsp:include>和<%@include file=""%>的区别(简单了解)
简单了解 include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改,否则视为已被修改.由于被包含的文件是在编译时才插入的 ...
- jsp/servlet 中sendRedirect,include,forward区别
1 sendRedirect response.sendRedirect(); 服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求新的地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以sess ...
- JavaBean组件在JSP文档中的应用
Bean: package cn.donghaua.bean; public class StringBean { private String message = "No message ...
随机推荐
- 【Windows】终端配置代理
Windows cmd 设置代理 设置 HTTP 代理: set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0 ...
- C++之OpenCV入门到提高007:调整图像亮度和对比度
一.介绍 今天是这个系列<C++之 Opencv 入门到提高>的第七篇文章.这篇文章也不难,介绍如何调整图像的亮度.图像本质上也是数据,既然是数据,我们就可以针对图像的每个像素进行增加或者 ...
- Solution Set - “谁将重力悬空,坠入一场蔚蓝的梦”
目录 0.「NOI Simu.」皮配 1.「BZOJ #4671」异或图 2.「CF 1158F」Density of subarrays 3.「CF 794G」Replace All 4.「UR # ...
- Android开发快速入门iOS开发概览
注:本文同步发布于微信公众号:stringwu的互联网杂谈 Android开发快速入门iOS开发概览 1 前言 笔者总结了自己在拥有Android开发的相关基础后入门iOS开发时遇到的点点滴滴给其他想 ...
- Quartz调度框架详解、运用场景、与集群部署实践
以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...
- Node.js 中 mysql 事务的写法
最近做一个公司内部的信息化平台,本着短平快,选择了 Nodejs + Express + Vue + mysql/mongodb 的技术路线. 该写法主要利用了递归,下面把事务的写法记录一下,做了简单 ...
- 火了整个春节的DeepSeek,他对AI产品的意义到底是什么?
相信春节期间各位的朋友圈一定被DeepSeek"轰炸"了,就算是普通人也获得了一些信息:国内AI取得了巨大突破. 但DeepSeek这次突破到底对一般的互联网从业者有什么帮助,绝大 ...
- 第一!天翼云荣获国际人工智能顶会AAAI 2024大模型数学理解&推理竞赛冠军!
近日,AAAI 2024 Global Competition on Math Problem Solving and Reasoning大赛落下帷幕,天翼云智能边缘事业部AI团队凭借在大模型基础能力 ...
- 【忍者算法】从图书馆编目到数组搜索:探索缺失的第一个正整数|LeetCode 41 缺失的第一个正整数
从图书馆编目到数组搜索:探索缺失的第一个正整数 生活中的算法 想象你是一位图书馆管理员,正在整理一排连续编号的图书.这些书应该从1号开始按顺序排列,但是有些编号的书不见了.你的任务是找出第一个缺失的编 ...
- Flink基础Source配置
一.pom文件 https://www.cnblogs.com/robots2/p/16048648.html 二.代码demo FlinkBaseSource.java package net.xd ...