Thymeleaf学习记录(8)--表达式基本对象
2024-08-22 18:07:41
基础对象
#ctx:上下文对象
/*
* ======================================================================
* See javadoc API for class org.thymeleaf.context.IContext
* ======================================================================
*/ ${#ctx.locale}
${#ctx.variables} /*
* ======================================================================
* See javadoc API for class org.thymeleaf.context.IWebContext
* ======================================================================
*/ ${#ctx.applicationAttributes}
${#ctx.httpServletRequest}
${#ctx.httpServletResponse}
${#ctx.httpSession}
${#ctx.requestAttributes}
${#ctx.requestParameters}
${#ctx.servletContext}
${#ctx.sessionAttributes}
#locale:直接访问java.util.Locale
与当前请求关联的
#vars:org.thymeleaf.context.VariablesMap
上下文中所有变量的实例(通常包含在#ctx.variables
加本地变量中的变量)。
/*
* ======================================================================
* See javadoc API for class org.thymeleaf.context.VariablesMap
* ======================================================================
*/ ${#vars.get('foo')}
${#vars.containsKey('foo')}
${#vars.size()}
...
请求/会话属性的Web上下文命名空间等。
- param:用于检索请求参数。${param.foo}是一个String[]带有foo请求参数值的,因此${param.foo[0]}通常用于获取第一个值。
• /*
• * ============================================================================
• * See javadoc API for class org.thymeleaf.context.WebRequestParamsVariablesMap
• * ============================================================================
• */
•
• ${param.foo} // Retrieves a String[] with the values of request parameter 'foo'
• ${param.size()}
• ${param.isEmpty()}
• ${param.containsKey('foo')}
• ...
- session:用于检索会话属性。
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.context.WebSessionVariablesMap
• * ======================================================================
• */
•
• ${session.foo} // Retrieves the session atttribute 'foo'
• ${session.size()}
• ${session.isEmpty()}
• ${session.containsKey('foo')}
• ...
- application:用于检索应用程序/ servlet上下文属性。
• /*
• * =============================================================================
• * See javadoc API for class org.thymeleaf.context.WebServletContextVariablesMap
• * =============================================================================
• */
•
• ${application.foo} // Retrieves the ServletContext atttribute 'foo'
• ${application.size()}
• ${application.isEmpty()}
• ${application.containsKey('foo')}
• ...
Web上下文对象
#httpServletRequest:直接访问javax.servlet.http.HttpServletRequest
与当前请求关联的对象
${#httpServletRequest.getAttribute('foo')}
${#httpServletRequest.getParameter('foo')}
${#httpServletRequest.getContextPath()}
${#httpServletRequest.getRequestName()}
...
- #httpSession:直接访问javax.servlet.http.HttpSession与当前请求关联的对象。
• ${#httpSession.getAttribute('foo')}
• ${#httpSession.id}
• ${#httpSession.lastAccessedTime}
• ...
Spring上下文对象
#themes:提供与Spring spring:theme
JSP标记相同的功能
表达式实用程序对象
#dates:java.util.Date
对象的实用方法
/*
* ======================================================================
* See javadoc API for class org.thymeleaf.expression.Dates
* ======================================================================
*/ /*
* Format date with the standard locale format
* Also works with arrays, lists or sets
*/
${#dates.format(date)}
${#dates.arrayFormat(datesArray)}
${#dates.listFormat(datesList)}
${#dates.setFormat(datesSet)} /*
* Format date with the ISO8601 format
* Also works with arrays, lists or sets
*/
${#dates.formatISO(date)}
${#dates.arrayFormatISO(datesArray)}
${#dates.listFormatISO(datesList)}
${#dates.setFormatISO(datesSet)} /*
* Format date with the specified pattern
* Also works with arrays, lists or sets
*/
${#dates.format(date, 'dd/MMM/yyyy HH:mm')}
${#dates.arrayFormat(datesArray, 'dd/MMM/yyyy HH:mm')}
${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')}
${#dates.setFormat(datesSet, 'dd/MMM/yyyy HH:mm')} /*
* Obtain date properties
* Also works with arrays, lists or sets
*/
${#dates.day(date)} // also arrayDay(...), listDay(...), etc.
${#dates.month(date)} // also arrayMonth(...), listMonth(...), etc.
${#dates.monthName(date)} // also arrayMonthName(...), listMonthName(...), etc.
${#dates.monthNameShort(date)} // also arrayMonthNameShort(...), listMonthNameShort(...), etc.
${#dates.year(date)} // also arrayYear(...), listYear(...), etc.
${#dates.dayOfWeek(date)} // also arrayDayOfWeek(...), listDayOfWeek(...), etc.
${#dates.dayOfWeekName(date)} // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc.
${#dates.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc.
${#dates.hour(date)} // also arrayHour(...), listHour(...), etc.
${#dates.minute(date)} // also arrayMinute(...), listMinute(...), etc.
${#dates.second(date)} // also arraySecond(...), listSecond(...), etc.
${#dates.millisecond(date)} // also arrayMillisecond(...), listMillisecond(...), etc. /*
* Create date (java.util.Date) objects from its components
*/
${#dates.create(year,month,day)}
${#dates.create(year,month,day,hour,minute)}
${#dates.create(year,month,day,hour,minute,second)}
${#dates.create(year,month,day,hour,minute,second,millisecond)} /*
* Create a date (java.util.Date) object for the current date and time
*/
${#dates.createNow()} ${#dates.createNowForTimeZone()} /*
* Create a date (java.util.Date) object for the current date (time set to 00:00)
*/
${#dates.createToday()} ${#dates.createTodayForTimeZone()}
- #calendars:类似于#dates,但对于java.util.Calendar对象:
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Calendars
• * ======================================================================
• */
•
• /*
• * Format calendar with the standard locale format
• * Also works with arrays, lists or sets
• */
• ${#calendars.format(cal)}
• ${#calendars.arrayFormat(calArray)}
• ${#calendars.listFormat(calList)}
• ${#calendars.setFormat(calSet)}
•
• /*
• * Format calendar with the ISO8601 format
• * Also works with arrays, lists or sets
• */
• ${#calendars.formatISO(cal)}
• ${#calendars.arrayFormatISO(calArray)}
• ${#calendars.listFormatISO(calList)}
• ${#calendars.setFormatISO(calSet)}
•
• /*
• * Format calendar with the specified pattern
• * Also works with arrays, lists or sets
• */
• ${#calendars.format(cal, 'dd/MMM/yyyy HH:mm')}
• ${#calendars.arrayFormat(calArray, 'dd/MMM/yyyy HH:mm')}
• ${#calendars.listFormat(calList, 'dd/MMM/yyyy HH:mm')}
• ${#calendars.setFormat(calSet, 'dd/MMM/yyyy HH:mm')}
•
• /*
• * Obtain calendar properties
• * Also works with arrays, lists or sets
• */
• ${#calendars.day(date)} // also arrayDay(...), listDay(...), etc.
• ${#calendars.month(date)} // also arrayMonth(...), listMonth(...), etc.
• ${#calendars.monthName(date)} // also arrayMonthName(...), listMonthName(...), etc.
• ${#calendars.monthNameShort(date)} // also arrayMonthNameShort(...), listMonthNameShort(...), etc.
• ${#calendars.year(date)} // also arrayYear(...), listYear(...), etc.
• ${#calendars.dayOfWeek(date)} // also arrayDayOfWeek(...), listDayOfWeek(...), etc.
• ${#calendars.dayOfWeekName(date)} // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc.
• ${#calendars.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc.
• ${#calendars.hour(date)} // also arrayHour(...), listHour(...), etc.
• ${#calendars.minute(date)} // also arrayMinute(...), listMinute(...), etc.
• ${#calendars.second(date)} // also arraySecond(...), listSecond(...), etc.
• ${#calendars.millisecond(date)} // also arrayMillisecond(...), listMillisecond(...), etc.
•
• /*
• * Create calendar (java.util.Calendar) objects from its components
• */
• ${#calendars.create(year,month,day)}
• ${#calendars.create(year,month,day,hour,minute)}
• ${#calendars.create(year,month,day,hour,minute,second)}
• ${#calendars.create(year,month,day,hour,minute,second,millisecond)}
•
• ${#calendars.createForTimeZone(year,month,day,timeZone)}
• ${#calendars.createForTimeZone(year,month,day,hour,minute,timeZone)}
• ${#calendars.createForTimeZone(year,month,day,hour,minute,second,timeZone)}
• ${#calendars.createForTimeZone(year,month,day,hour,minute,second,millisecond,timeZone)}
•
• /*
• * Create a calendar (java.util.Calendar) object for the current date and time
• */
• ${#calendars.createNow()}
•
• ${#calendars.createNowForTimeZone()}
•
• /*
• * Create a calendar (java.util.Calendar) object for the current date (time set to 00:00)
• */
• ${#calendars.createToday()}
•
• ${#calendars.createTodayForTimeZone()}
- #numbers:数字对象的实用方法:
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Numbers
• * ======================================================================
• */
•
• /*
• * ==========================
• * Formatting integer numbers
• * ==========================
• */
•
• /*
• * Set minimum integer digits.
• * Also works with arrays, lists or sets
• */
• ${#numbers.formatInteger(num,3)}
• ${#numbers.arrayFormatInteger(numArray,3)}
• ${#numbers.listFormatInteger(numList,3)}
• ${#numbers.setFormatInteger(numSet,3)}
•
•
• /*
• * Set minimum integer digits and thousands separator:
• * 'POINT', 'COMMA', 'WHITESPACE', 'NONE' or 'DEFAULT' (by locale).
• * Also works with arrays, lists or sets
• */
• ${#numbers.formatInteger(num,3,'POINT')}
• ${#numbers.arrayFormatInteger(numArray,3,'POINT')}
• ${#numbers.listFormatInteger(numList,3,'POINT')}
• ${#numbers.setFormatInteger(numSet,3,'POINT')}
•
•
• /*
• * ==========================
• * Formatting decimal numbers
• * ==========================
• */
•
• /*
• * Set minimum integer digits and (exact) decimal digits.
• * Also works with arrays, lists or sets
• */
• ${#numbers.formatDecimal(num,3,2)}
• ${#numbers.arrayFormatDecimal(numArray,3,2)}
• ${#numbers.listFormatDecimal(numList,3,2)}
• ${#numbers.setFormatDecimal(numSet,3,2)}
•
• /*
• * Set minimum integer digits and (exact) decimal digits, and also decimal separator.
• * Also works with arrays, lists or sets
• */
• ${#numbers.formatDecimal(num,3,2,'COMMA')}
• ${#numbers.arrayFormatDecimal(numArray,3,2,'COMMA')}
• ${#numbers.listFormatDecimal(numList,3,2,'COMMA')}
• ${#numbers.setFormatDecimal(numSet,3,2,'COMMA')}
•
• /*
• * Set minimum integer digits and (exact) decimal digits, and also thousands and
• * decimal separator.
• * Also works with arrays, lists or sets
• */
• ${#numbers.formatDecimal(num,3,'POINT',2,'COMMA')}
• ${#numbers.arrayFormatDecimal(numArray,3,'POINT',2,'COMMA')}
• ${#numbers.listFormatDecimal(numList,3,'POINT',2,'COMMA')}
• ${#numbers.setFormatDecimal(numSet,3,'POINT',2,'COMMA')}
•
•
•
• /*
• * ==========================
• * Utility methods
• * ==========================
• */
•
• /*
• * Create a sequence (array) of integer numbers going
• * from x to y
• */
• ${#numbers.sequence(from,to)}
• ${#numbers.sequence(from,to,step)}
- #strings:
String
对象的实用方法
/*
* ======================================================================
* See javadoc API for class org.thymeleaf.expression.Strings
* ======================================================================
*/ /*
* Null-safe toString()
*/
${#strings.toString(obj)} // also array*, list* and set* /*
* Check whether a String is empty (or null). Performs a trim() operation before check
* Also works with arrays, lists or sets
*/
${#strings.isEmpty(name)}
${#strings.arrayIsEmpty(nameArr)}
${#strings.listIsEmpty(nameList)}
${#strings.setIsEmpty(nameSet)} /*
* Perform an 'isEmpty()' check on a string and return it if false, defaulting to
* another specified string if true.
* Also works with arrays, lists or sets
*/
${#strings.defaultString(text,default)}
${#strings.arrayDefaultString(textArr,default)}
${#strings.listDefaultString(textList,default)}
${#strings.setDefaultString(textSet,default)} /*
* Check whether a fragment is contained in a String
* Also works with arrays, lists or sets
*/
${#strings.contains(name,'ez')} // also array*, list* and set*
${#strings.containsIgnoreCase(name,'ez')} // also array*, list* and set* /*
* Check whether a String starts or ends with a fragment
* Also works with arrays, lists or sets
*/
${#strings.startsWith(name,'Don')} // also array*, list* and set*
${#strings.endsWith(name,endingFragment)} // also array*, list* and set* /*
* Substring-related operations
* Also works with arrays, lists or sets
*/
${#strings.indexOf(name,frag)} // also array*, list* and set*
${#strings.substring(name,3,5)} // also array*, list* and set*
${#strings.substringAfter(name,prefix)} // also array*, list* and set*
${#strings.substringBefore(name,suffix)} // also array*, list* and set*
${#strings.replace(name,'las','ler')} // also array*, list* and set* /*
* Append and prepend
* Also works with arrays, lists or sets
*/
${#strings.prepend(str,prefix)} // also array*, list* and set*
${#strings.append(str,suffix)} // also array*, list* and set* /*
* Change case
* Also works with arrays, lists or sets
*/
${#strings.toUpperCase(name)} // also array*, list* and set*
${#strings.toLowerCase(name)} // also array*, list* and set* /*
* Split and join
*/
${#strings.arrayJoin(namesArray,',')}
${#strings.listJoin(namesList,',')}
${#strings.setJoin(namesSet,',')}
${#strings.arraySplit(namesStr,',')} // returns String[]
${#strings.listSplit(namesStr,',')} // returns List<String>
${#strings.setSplit(namesStr,',')} // returns Set<String> /*
* Trim
* Also works with arrays, lists or sets
*/
${#strings.trim(str)} // also array*, list* and set* /*
* Compute length
* Also works with arrays, lists or sets
*/
${#strings.length(str)} // also array*, list* and set* /*
* Abbreviate text making it have a maximum size of n. If text is bigger, it
* will be clipped and finished in "..."
* Also works with arrays, lists or sets
*/
${#strings.abbreviate(str,10)} // also array*, list* and set* /*
* Convert the first character to upper-case (and vice-versa)
*/
${#strings.capitalize(str)} // also array*, list* and set*
${#strings.unCapitalize(str)} // also array*, list* and set* /*
* Convert the first character of every word to upper-case
*/
${#strings.capitalizeWords(str)} // also array*, list* and set*
${#strings.capitalizeWords(str,delimiters)} // also array*, list* and set* /*
* Escape the string
*/
${#strings.escapeXml(str)} // also array*, list* and set*
${#strings.escapeJava(str)} // also array*, list* and set*
${#strings.escapeJavaScript(str)} // also array*, list* and set*
${#strings.unescapeJava(str)} // also array*, list* and set*
${#strings.unescapeJavaScript(str)} // also array*, list* and set* /*
* Null-safe comparison and concatenation
*/
${#strings.equals(first, second)}
${#strings.equalsIgnoreCase(first, second)}
${#strings.concat(values...)}
${#strings.concatReplaceNulls(nullValue, values...)} /*
* Random
*/
${#strings.randomAlphanumeric(count)}
- #objects:一般对象的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Objects
• * ======================================================================
• */
•
• /*
• * Return obj if it is not null, and default otherwise
• * Also works with arrays, lists or sets
• */
• ${#objects.nullSafe(obj,default)}
• ${#objects.arrayNullSafe(objArray,default)}
• ${#objects.listNullSafe(objList,default)}
• ${#objects.setNullSafe(objSet,default)}
- #bools:布尔评估的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Bools
• * ======================================================================
• */
•
• /*
• * Evaluate a condition in the same way that it would be evaluated in a th:if tag
• * (see conditional evaluation chapter afterwards).
• * Also works with arrays, lists or sets
• */
• ${#bools.isTrue(obj)}
• ${#bools.arrayIsTrue(objArray)}
• ${#bools.listIsTrue(objList)}
• ${#bools.setIsTrue(objSet)}
•
• /*
• * Evaluate with negation
• * Also works with arrays, lists or sets
• */
• ${#bools.isFalse(cond)}
• ${#bools.arrayIsFalse(condArray)}
• ${#bools.listIsFalse(condList)}
• ${#bools.setIsFalse(condSet)}
•
• /*
• * Evaluate and apply AND operator
• * Receive an array, a list or a set as parameter
• */
• ${#bools.arrayAnd(condArray)}
• ${#bools.listAnd(condList)}
• ${#bools.setAnd(condSet)}
•
• /*
• * Evaluate and apply OR operator
• * Receive an array, a list or a set as parameter
• */
• ${#bools.arrayOr(condArray)}
• ${#bools.listOr(condList)}
• ${#bools.setOr(condSet)}
- #arrays:数组的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Arrays
• * ======================================================================
• */
•
• /*
• * Converts to array, trying to infer array component class.
• * Note that if resulting array is empty, or if the elements
• * of the target object are not all of the same class,
• * this method will return Object[].
• */
• ${#arrays.toArray(object)}
•
• /*
• * Convert to arrays of the specified component class.
• */
• ${#arrays.toStringArray(object)}
• ${#arrays.toIntegerArray(object)}
• ${#arrays.toLongArray(object)}
• ${#arrays.toDoubleArray(object)}
• ${#arrays.toFloatArray(object)}
• ${#arrays.toBooleanArray(object)}
•
• /*
• * Compute length
• */
• ${#arrays.length(array)}
•
• /*
• * Check whether array is empty
• */
• ${#arrays.isEmpty(array)}
•
• /*
• * Check if element or elements are contained in array
• */
• ${#arrays.contains(array, element)}
• ${#arrays.containsAll(array, elements)}
- #lists:列表的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Lists
• * ======================================================================
• */
•
• /*
• * Converts to list
• */
• ${#lists.toList(object)}
•
• /*
• * Compute size
• */
• ${#lists.size(list)}
•
• /*
• * Check whether list is empty
• */
• ${#lists.isEmpty(list)}
•
• /*
• * Check if element or elements are contained in list
• */
• ${#lists.contains(list, element)}
• ${#lists.containsAll(list, elements)}
•
• /*
• * Sort a copy of the given list. The members of the list must implement
• * comparable or you must define a comparator.
• */
• ${#lists.sort(list)}
• ${#lists.sort(list, comparator)
- #sets:集合的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Sets
• * ======================================================================
• */
•
• /*
• * Converts to set
• */
• ${#sets.toSet(object)}
•
• /*
• * Compute size
• */
• ${#sets.size(set)}
•
• /*
• * Check whether set is empty
• */
• ${#sets.isEmpty(set)}
•
• /*
• * Check if element or elements are contained in set
• */
• ${#sets.contains(set, element)}
• ${#sets.containsAll(set, elements)}
- #maps:地图的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Maps
• * ======================================================================
• */
•
• /*
• * Compute size
• */
• ${#maps.size(map)}
•
• /*
• * Check whether map is empty
• */
• ${#maps.isEmpty(map)}
•
• /*
• * Check if key/s or value/s are contained in maps
• */
• ${#maps.containsKey(map, key)}
• ${#maps.containsAllKeys(map, keys)}
• ${#maps.containsValue(map, value)}
• ${#maps.containsAllValues(map, value)}
- #aggregates:用于在数组或集合上创建聚合的实用程序方法
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Aggregates
• * ======================================================================
• */
•
• /*
• * Compute sum. Returns null if array or collection is empty
• */
• ${#aggregates.sum(array)}
• ${#aggregates.sum(collection)}
•
• /*
• * Compute average. Returns null if array or collection is empty
• */
• ${#aggregates.avg(array)}
• ${#aggregates.avg(collection)}
- #messages:用于在变量表达式中获取外部化消息的实用程序方法,与使用#{...}语法获取它们的方式相同。
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Messages
• * ======================================================================
• */
•
• /*
• * Obtain externalized messages. Can receive a single key, a key plus arguments,
• * or an array/list/set of keys (in which case it will return an array/list/set of
• * externalized messages).
• * If a message is not found, a default message (like '??msgKey??') is returned.
• */
• ${#messages.msg('msgKey')}
• ${#messages.msg('msgKey', param1)}
• ${#messages.msg('msgKey', param1, param2)}
• ${#messages.msg('msgKey', param1, param2, param3)}
• ${#messages.msgWithParams('msgKey', new Object[] {param1, param2, param3, param4})}
• ${#messages.arrayMsg(messageKeyArray)}
• ${#messages.listMsg(messageKeyList)}
• ${#messages.setMsg(messageKeySet)}
•
• /*
• * Obtain externalized messages or null. Null is returned instead of a default
• * message if a message for the specified key is not found.
• */
• ${#messages.msgOrNull('msgKey')}
• ${#messages.msgOrNull('msgKey', param1)}
• ${#messages.msgOrNull('msgKey', param1, param2)}
• ${#messages.msgOrNull('msgKey', param1, param2, param3)}
• ${#messages.msgOrNullWithParams('msgKey', new Object[] {param1, param2, param3, param4})}
• ${#messages.arrayMsgOrNull(messageKeyArray)}
• ${#messages.listMsgOrNull(messageKeyList)}
• ${#messages.setMsgOrNull(messageKeySet)}
- #ids:用于处理id可能重复的属性的实用程序方法(例如,作为迭代的结果)。
• /*
• * ======================================================================
• * See javadoc API for class org.thymeleaf.expression.Ids
• * ======================================================================
• */
•
• /*
• * Normally used in th:id attributes, for appending a counter to the id attribute value
• * so that it remains unique even when involved in an iteration process.
• */
• ${#ids.seq('someId')}
•
• /*
• * Normally used in th:for attributes in <label> tags, so that these labels can refer to Ids
• * generated by means if the #ids.seq(...) function.
• *
• * Depending on whether the <label> goes before or after the element with the #ids.seq(...)
• * function, the "next" (label goes before "seq") or the "prev" function (label goes after
• * "seq") function should be called.
• */
• ${#ids.next('someId')}
• ${#ids.prev('someId')}
使用示例:
最新文章
- PHP中函数sprintf .vsprintf (占位符)
- Qt线程(2) QThread中使用WorkObject
- 黑马程序员——JAVA基础之常用DOS命令和环境变量的配置
- Translation002—Package Index(Android包索引)
- shell(1)
- VS2013打包与部署
- delphi中一切皆指针
- oracle一个用户密码管理多达同意三次企图登录
- freemarker中的list 前端模板
- Laravel 中使用 Redis 数据库
- React-Native集成到已有项目中的总结
- ionic 最简单的路由形式,头部固定,下面tab切换-------一个简单的单页切换起飞了
- 九度OJ 1016 火星A + B 未AC版,整型存储不下
- Vue中transition和animation的使用
- Python的图像库
- redis(一)
- localStorage,sessionStorage,cookie使用场景和区别
- Error while executing topic command : Replication factor: 2 larger than available brokers: 0.
- L290 英语中级班-3月上
- Java通过遍历sessionId获取服务器所有会话session
热门文章
- socketserver模块解析
- 算法导论-MIT笔记
- Java_日志接口实现
- 架构师养成记--37.简单shell编程
- (C/C++) 指向函數的指標
- Python 全栈开发:dict(字典)常用方法操作、dict嵌套
- PyCharm+selenium环境搭建报错:Traceback (most recent call last): TypeError: &#39;module&#39; object is not callable
- [Xamarin] 簡單實作ListActivity (转帖)
- 使用NHibernate(1)--资料汇总
- 修改docker的port端口映射