Web技术
穷目楼
白日依山尽,黄河入海流。欲穷千里目,更上一层楼。
展开
-
Python全局变量不被共享的原因
习惯了其它语言开发方式,可能会对Python中全局变量不被共享的感到困惑。“Python中全局变量不被共享”其实是不存在的,造成这个“感觉”的原因是没意识到多进程环境的存在。在Web领域使用较多的Java平台上,一个Web站点启动后可能就只有一个进程,程序环境很可能是一个进程+多个线程,此时全局变量的变更很自然被程序里的所有代码看到。来到CPython世界,由于GIL(全局解释器锁)的存在,无法充分利用CPU的利用效率,生产部署的时候会采用多进程的机制,也就是启动多个CPython来充分使用硬件资源,这原创 2021-07-26 18:09:41 · 347 阅读 · 0 评论 -
部署django应用
django开发时只需要python就能完成,利用其自带的开发服务,可以方便在开发环境运行起应用,但部署于生产时则需要一些额外的操作。配置修改首先是配置的修改,settings.py里有些最小配置需要修改STATIC_ROOT = os.path.join(os.getcwd(), 'static')ALLOWED_HOSTS = ['127.0.0.1']DEBUG = False如果应用里有图片,样式表资源,需要设置STATIC_ROOT; DEBUG模式必须关掉,否则会暴露过多信息造成安原创 2020-05-31 09:45:11 · 261 阅读 · 0 评论 -
Java Servlet环境中获取完整的客户端请求地址
客户端请求服务的地址中除了基本的协议,主机,端口信息外,还可能包含查询串,若想获取完整的请求地址,则需要考虑到存在查询串的可能性。一个获取完整客户端请求地址的方法:public static String getFullURL(HttpServletRequest request) { StringBuffer requestURL = request.getRequestURL();...原创 2020-04-24 10:27:24 · 398 阅读 · 0 评论 -
Spring Xml配置中Bean的引用
Spring最早支持的配置方式是Java系技术很传统的Xml配置方式,通过Xml可以配置bean的声明,引用。如果bean之间有引用,Spring的<property>标签的的ref属性可以用来表达这种引用关系<bean class="com.me.Hello"> <property name="who" ref="people" /></be...原创 2020-03-31 10:01:54 · 756 阅读 · 0 评论 -
RestTemplate访问RESTful服务
Spring本身提供了访问RESTFul服务的的工具RestTemplate,在Spring Android项目中也提供了该工具。正如其名所示,其概念上和JdbcTemplate, JmsTemplate类似,虽然RestTemplate看似主要在于和遵循RESTful架构的服务交互,但是其实RestTemplate可以作为一个通用的http访问工具使用。RestTemplate 的底层默认使用...原创 2020-03-31 09:55:48 · 181 阅读 · 0 评论 -
Spring Security的Servlet集成
Spring Security 对 Servlet API 提供了一些集成支持。Servlet 2.5+获取当前用户的username,对其进行null检查可以得知用户是否通过认证。HttpServletRequest.getRemoteUser()等价于SecurityContextHolder.getContext().getAuthentication().getName()...原创 2020-03-30 16:39:18 · 347 阅读 · 0 评论 -
利用Maven的War Overlays实现War包资源共享
Maven War plugin提供了overlays功能,overlays提供了多个web应用程序共享资源的途径。通过overlays,可以通过包依赖实现个性化定制开发,而不是直接在已有成熟软件的源码下进行个性化定制开发。overlays 样例假设当前正在构建的项目documentedproject有如下结构 |-- pom.xml `-- src `-- main ...原创 2020-03-27 16:58:52 · 1201 阅读 · 0 评论 -
XML Schema中include和import的区别
复杂的XML Schema一般会分割成多个文件编写,然后通过引用再把彼此联系起来,逻辑上成为一个完成的XML Schema。通过xsd:include和xsd:import都能完成在一个xsd文件中引用其他xsd文件的功能,两者具体的差别在于目标命名空间方面。xsd:include用于引用和当前xsd定义的target namespace一致的xsd文件。<xsd:include sc...原创 2020-03-27 14:56:22 · 746 阅读 · 0 评论 -
SOAP协议入门
SOAP(Simple Object Access Protocol)简单对象访问协议,是一种基于XML的交换结构数据的网络通信协议,是W3C推荐标准。SOAP依赖于其他协议实现传输功能,最常见的就是HTTP,SOAP与HTTP组合被广泛应用于Web Services中,此外SMTP,JMS等协议(技术)也可以用于传输SOAP消息。SOAP由于基于XML,所以具有平台独立性,语言独立性,简单,易...原创 2020-03-23 15:39:36 · 2546 阅读 · 0 评论 -
SOAP Web Service的RPC风格与Document风格
styleSOAP Web Service有两种风格(style),RPC和Document。RPCRPC style有由SOAP标准定义的固定的SOAP消息body格式要求,由远程调用的方法名元素包裹着许多个参数元素构成,由于有固定的格式,marshalling/unmarshalling是标准中的一部分,SOAP库自动化这个过程。RPC风格的服务对应用程序代码的耦合较紧。<soa...原创 2020-03-23 15:13:50 · 681 阅读 · 0 评论 -
Java Servlet环境中获取客户端IP
由于用户可能采用了代理,或者服务器处于负载均衡的环境下,只调用HttpServletRequest.getRemoteAddr()得到的地址不一定是想要的数据。某些代理会在HTTP请求中加入一些头信息,通过这些头信息可以获取到客户端原始的IP地址。一种考虑了有代理存在的情况的获取客户端IP的方法:private static final String[] HEADERS_TO_TRY = { ...原创 2020-03-21 21:36:50 · 536 阅读 · 0 评论 -
利用Axis访问rpc/encorded风格的Web Service
Soap 基于的Web Service在演化,实现其的技术栈也在随之变化。Java领域出现了许多了Web Service相关的技术,从早期的Apache Axis,xfire到今天的Apache Axis2, Apache CXF, Metro,Spring WS。Java对Soap Web Service在早期提出了JAX-RPC的模型,今天JAX-RPC则被JAX-WS代替,这也体现了业界正在...原创 2020-03-23 10:16:13 · 215 阅读 · 0 评论 -
FreeMaker 宏(macro)与自定义指令
宏(macro)是自定义指令(directive)的一种方法,使用宏能实现在模版级别自定义指令,另一种自定义指令的方式是再Java级别实现指令。宏的概念宏是对一段模版片段的定义,在定义宏后,可通过用户自定义指令的语法<@ macro_name />引用,宏本身通过<#macro></#macro>预定义指令定义。<#macro hello> ...原创 2019-12-21 10:49:56 · 519 阅读 · 0 评论 -
Thymeleaf属性优先级
同计算机语言中各种操作符有优先级一样,类似的当同一个标签中有多个th:*属性时,Thymleaf在处理这些属性时也有优先级的问题。<ul> <li th:each="item : ${items}" th:text="${item.description}">Item description here...</li></ul>Thymleaf中定义的属性优先级,从上到下优先级越来越低 Or原创 2017-03-09 21:43:48 · 688 阅读 · 0 评论 -
Thymeleaf条件判断
th:ifth:if属性求Bool值,只有true的时候其所在的标签及该标签中的内容才会被渲染到输出结果中<a href="comments.html" th:href="@{/product/comments(prodId=${prod.id})}" th:if="${not #lists.isEmpty(prod.comments)}">view</a>th:if=“express原创 2017-03-12 22:30:08 · 33665 阅读 · 0 评论 -
Thymeleaf中的迭代
Thymleaf中用th:each属性实现迭代操作。 <tr th:each="prod : ${prods}"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{原创 2017-03-16 23:19:31 · 9055 阅读 · 0 评论 -
Thymeleaf的算术操作和比较操作
算术操作Thymeleaf标准表达式引擎支持算术操作符:+, -, *, /(div), %(mod)th:with="isEven=(${prodStat.count} % 2 == 0)"也可以把算术操作符写在变量表达式中th:with="isEven=${prodStat.count % 2 == 0}"此时,表达式的解析实际上是由OGNL/SpringEL完成的比较操作Thymeleaf支持原创 2017-02-16 22:42:02 · 10391 阅读 · 0 评论 -
Thymeleaf条件表达式和默认表达式
条件表达式条件表达式condition?then:else根据conditon的值,只会有then,else中的一个表达式被求值。conditon为true->then, condition为false->else。<tr th:class="${row.even}? 'even' : 'odd'"> ...</tr>其中条件表达式的三个部分`condition?then:else`本身都是表原创 2017-02-16 22:47:55 · 3014 阅读 · 0 评论 -
Thymeleaf设置任意属性
Thymeleaf通过th:attr属性,可以设置任意的html属性。<form action="subscribe.html" th:attr="action=@{/subscribe}"> <fieldset> <input type="text" name="email" /> <input type="submit" value="Subscribe me!" th:at原创 2017-02-21 21:17:54 · 6208 阅读 · 0 评论 -
Thymeleaf设置特定属性
Thymeleaf除了有th:attr这种通用的设置属性的方法外,提供了th:*语法设置特定的属性,*为标准属性的属性名。<input type="submit" value="Subscribe me!" th:value="#{subscribe.submit}"/><form action="subscribe.html" th:action="@{/subscribe}"><li><a原创 2017-02-21 21:30:42 · 751 阅读 · 0 评论 -
Thymeleaf设置固定值属性
一些属性的值比较特殊,要么该属性不出现在标签中,要么以固定的内容作为值出现,比如checked,的值只应该是“checked”,其他属性readonly, selected等也有类似的情况。Thymeleaf提供了与这些属性对应的th:*属性,其值作为一个条件被求值,求值如果为true,该属性被设置为对应的固定值,否则该属性将不会被赋值。<input type="checkbox" name="ac原创 2017-02-21 21:34:20 · 1372 阅读 · 0 评论 -
Thymeleaf一次性设置多个属性为相同值
Thymeleaf提供了两个特殊的属性用于一次性设置多个属性为相同的值:th:alt-title和th:lang-xmllang。 按名字即可知道 th:alt-title 设置 alt 和title. th:lang-xmllang 设置 lang 和 xml:lang.<img src="../../images/gtvglogo.png" th:attr="src=@{/im原创 2017-02-21 21:37:05 · 1240 阅读 · 0 评论 -
Thymeleaf中用HTML5语法设置标签和属性
Thymeleaf支持HTML5的 “data-{prefix}-{name}” 语法作为使用th命名空间前缀设置属性的代替。<table> <tr data-th-each="user : ${users}"> <td data-th-text="${user.login}">...</td> <td data-th-text="${user.name}">原创 2017-02-21 21:39:37 · 2555 阅读 · 0 评论 -
Thymeleaf在属性头部与尾部附加值
Thymeleaf支持在属性的头部和尾部,在原有值的基础上附加新的值,而不仅仅是重新设置整个值。与th:attr对应,有头部附加属性th:attrprepend和尾部附加属性th:attrappend。<input type="button" value="Do it!" class="btn" th:attrappend="class=${' ' + cssStyle}" />当cssStyle为原创 2017-02-21 21:42:18 · 1916 阅读 · 0 评论 -
Thymeleaf文本连接和文字替换
文本连接无论是什么形式的文本:字面量'...',变量表达式求值或消息表达式求值的结果,都可以用'+'进行连接th:text="'The name of the user is ' + ${user.name}"文字替换文字替换可以方便的格式化包含变量的字符串,而无需使用文本连接'...' + '...'。文字替换的语法为| text substituion demo ${varialble} |原创 2017-02-12 18:16:39 · 10060 阅读 · 0 评论 -
Thymeleaf字面量
文本字面量用单引号'...'包围的字符串为文字面量,表示单引号本身需要转义\'<p> Now you are looking at a <span th:text="'working web application'">template file</span>.</p>数字字面量所见即所得,0,1,2,3…<p>The year is <span th:text="2013">1492</sp原创 2017-02-12 18:10:58 · 754 阅读 · 0 评论 -
Thymeleaf的文本操作
th:text属性th:text属性对其属性值求值,然后将求值结果设置为其本身所在标签的body。body> p th:utext="#{home.welcome}">Welcome to our grocery store!p> p>Today is: span th:text="${today}">13 February 2011span>p>body>th:text的原创 2017-02-12 18:02:31 · 4076 阅读 · 0 评论 -
Thymeleaf URL表达式
URL在Thymleaf中是第一类公民,有其专有的表达式语法@{...}。共存在2大类URL:绝对URL http://www.your.domain相对URL,分为四类 相对于页面 user/login.html相对于上下文 /itemdetails?id=3 (服务的上下文名会被自动添加)相对于服务器 ~/billing/processInvoice (可以调用在另一个context(原创 2017-02-12 17:59:07 · 13576 阅读 · 2 评论 -
Thymeleaf选择变量表达式
选择变量表达式*{…}是另一种类似...,表示变量的方法,但是选择变量表达式在执行时是在选择的对象上求解,而{...},表示变量的方法,但是选择变量表达式在执行时是在选择的对象上求解,而{…}是在上下文的变量Map上求解。通过th:object属性指明选择变量表达式的求解对象 <div th:object="${session.user}"> <p>Name: <span th:text=原创 2017-02-11 21:46:56 · 4006 阅读 · 3 评论 -
Thymeleaf消息表达式
消息表达式用于从消息源中提取消息内容实现国际化。表达式的语法:#{…}<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>消息属性可以是传统的静态值home.welcome=¡Bienvenido a nuestra tienda de comestibles!也可以带有参数声明,参数声明格式符合java.text.Mes原创 2017-02-11 21:41:39 · 5077 阅读 · 1 评论 -
Thymeleaf变量表达式
Thymeleaf的用...来表示变量表达式,正常情况下,执行{...}来表示变量表达式,正常情况下,执行{…}时,实际上是针对context中的variables map执行OGNL表达式。在与SpringMVC集成的时候,用的是Spring EL。<p>Today is: <span th:text="${today}">13 february 2011</span>.</p>实际等效于执行了原创 2017-02-11 21:33:52 · 2080 阅读 · 1 评论 -
让Struts的过滤器“放过”Action的某些方法
Struts的过滤器本身提供了类似AOP,java.servlet.Filter的过滤拦截功能,所以对Action以及Action的方法的拦截可以用更加“Struts”的Interceptor来实现。Interceptor可以直接拦截到Action的方法层面,只要在Interceptor.intercept()中判断方法是否需要被拦截即可实现,Struts本身提供了抽象类MethodFilterIn原创 2017-02-04 22:32:55 · 1562 阅读 · 0 评论 -
Apache Struts的拦截器
Java技术栈中典型的SSH里面,Struts为Web开发提供了良好的MVC支持,在基于Servlet API标准的MVC实现中,有的基于javax.servlet.Servlet实现,有的基于javax.servlet.Filter实 现,Struts是基于Filter实现的。如果要实现“拦截”, “过滤”的语义,自然可以用标准的javax.servlet.Filter实现,但是如果项目中已经使用原创 2017-02-04 22:28:47 · 324 阅读 · 0 评论 -
Base64
Base64是一种把二进制数据转换成文本表示形式的方法,其基于64个可打印字符对数据进行编解码。Base64提供了二进制数据到文本数据转换的一种方法,因此利用Base64可以实现二进制数据与基于文本的系统之间的交互。Base64在包括email,browser在内的许多应用程序里得到应用。基本概念Base64顾名思义是根据64个基本字符来对数据进行编码,包括a-z,A-Z,0-9共62个字符和其它另原创 2017-02-04 22:26:03 · 422 阅读 · 0 评论 -
Javascript闭包
概念Javascript支持闭包(closure)的概念,Javascript里的闭包是一种特殊的对象,由函数和函数创建时所处的环境组成,环境里包括了闭包被创建时所在的作用域里的所有本地变量。function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return di原创 2017-02-04 22:23:52 · 295 阅读 · 0 评论