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中#{},${}和%{}的区别的更多相关文章

  1. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  2. <%@page include%>、<%@include%>、<jsp:include>三者之间的本质区别

    <%@page include%>.<%@include%>.<jsp:include>三者之间的本质区别 先从它的几个内置对象说起. application和se ...

  3. jsp中forward和redirect的区别(转)

    一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下: request.getRequestDispatcher("new.jsp").forward(reques ...

  4. JSP的getRequestDispatcher()与sendRedirect()的区别

    getRequestDispatcher()与sendRedirect()的区别   1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ; r ...

  5. 网站开发进阶(六)JSP两种声明变量的区别

    JSP两种声明变量的区别 在JSP中用两种声明变量的方法,一种是在<%! %>内,一种是在<% %>内.他们之间有什么区别呢?我们直接看一个JSP文件来理解. 代码如下: &l ...

  6. jsp中jsp:forward 与 redirect区别

    部分转载:http://hi.baidu.com/168zlf/item/2f4b2ad4351b881c20e2500c 在网上看到一些帖子,总结了一些区别,可以从以下几个方面来看: 1.从地址栏显 ...

  7. jsp页面中注释 <!-- --> 和<%-- --%> 的区别

    jsp页面中注释 <!-- --> 和<%-- --%> 的区别 原创 2016年09月01日 17:55:44 标签: jsp注释 5605 今天发现一个问题:在jsp代码中 ...

  8. <jsp:include>和<%@include file=""%>的区别(简单了解)

    简单了解 include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改,否则视为已被修改.由于被包含的文件是在编译时才插入的 ...

  9. jsp/servlet 中sendRedirect,include,forward区别

    1 sendRedirect response.sendRedirect(); 服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求新的地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以sess ...

  10. JavaBean组件在JSP文档中的应用

    Bean: package cn.donghaua.bean; public class StringBean { private String message = "No message ...

随机推荐

  1. Solution -「ROI 2018」「LOJ #2850」无进位加法

    \(\mathscr{Description}\)   Link.   给定 \(\{a_n\}\),每次令某个 \(a_i\leftarrow a_i+1\),最终得到 \(\{b_n\}\),求 ...

  2. C# WinForm 检查目标主机的端口是否可连接

    一个小工具. namespace IPPort_CheckTool { partial class MainForm { /// <summary> /// 必需的设计器变量. /// & ...

  3. 如何快速的开发一个完整的iOS直播app(创建房间)

    直播(创建房间) 1.进入主播界面,首先创建房间 2.设计房间模型(key,名称),key作为房间的唯一标识,用来找到房间 3.用socket创建房间,导入socket.io框架 4.一般一个客户端一 ...

  4. springBoot(1)--初步理解

    在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2)配置数据库连接.配置sprin ...

  5. K8S故障处理:临时设置节点为不可调度(cordon与drain区别)

    在Kubernetes中,节点驱逐是一种管理和维护集群的重要操作,允许节点在维护.升级或者发生故障时从集群中移除,等到节点修复后,再重新承担pod调度功能. 1.K8s节点驱逐 节点驱逐是指将节点上运 ...

  6. Hyper-V创建虚拟机配置IP等网络配置原理(Linux、Windows为例)

    大家知道Windows系统里面内置了Hyper-V管理器,用来创建和管理本地虚拟机环境.今天我创建了两台虚拟机,一台是CentOS7.9(Linux),另一台是Windows 11,然后发现,Linu ...

  7. Linux系统用户登录命令行或执行命令显示日志文件异常-bash: /var/log/ 解决办法

    经常会遇到Linux系统用户登录命令行或执行命令显示日志文件异常,比如:-bash: /var/log/xxx_audit/xxx_audit.log: Permission denied 其实是说开 ...

  8. Loadrunner11压测场景时最多跑5000个Vuser的问题解决办法

    当我在用Loadrunner11压测场景时,设置Start Vusers是10000个.但实际运行是发现大约跑到5000个左右,后面的基本都是异常.如图: 查看Vusers运行详情: Error... ...

  9. 3. 使用sql查询csv/json文件内容,还能关联查询?

    1. 简介 我们在前面的文章提到了calcite可以支持文件系统的数据源适配, 其实官方已经提供了相应的能力, 其支持csv和json的查询适配, 废话不多说, 直接展示. 2. Maven < ...

  10. arthas进行java应用不停服务情况下的class文件热部署更新

    我们在工作的过程中会遇到java应用已经部署或升级投入使用,发现某个单元文件有bug需要修正,但是客户的应用目前不能停止,而且不能因为一个非致命的bug来进行整个平台的一次升级.我们需要进行单文件的更 ...