搜尋
首頁Javajava教程springboot整合freemarker報錯怎麼解決

springboot整合freemarker報錯怎麼解決

May 19, 2023 pm 04:43 PM
springbootfreemarker

springboot整合freemarker踩坑

報錯

2021-04-23 02:01:18.148 ERROR 9484 --- [nio-8080-exec-1] o.a.c.c.C.[ .[.[/].[dispatcherServlet]    : 路徑[] 上下文中servlet [dispatcherServlet] 的Servlet.service() 拋出例外狀況[請求處理失敗;巢狀異常是 freemarker.core.InvalidReferenceException:以下內容已計算為 null 或缺失:
==> hots  [範本“inc/right.ftl”第6 行第11 列]

#----
#提示:如果已知失敗的表達式合法地引用有時為空或缺失的內容,指定預設值(如 myOptionalVar!myDefault),或使用 when-presentwhen-missing#if>。 (這些僅覆寫表達式的最後一步;要覆寫整個表達式,請使用括號:(myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

#-- --
FTL 堆疊追蹤(「~」表示與巢狀相關):
    - 失敗於:@hots  [在範本「inc/right.ftl」第6 行第9 列]
    - 已通過: #include "/inc/right.ftl" [在模板"index.ftl" 的第52 行第13 列]
    ~ 通過:#nested [在巨集“layout”中的模板“inc/layout. ftl」中]在第25 行第5 列]
    ~ 透過以下方式到達:@layout "首頁"  [在範本「index.ftl」第2 行第1 列]
----]根本原因

freemarker.core.InvalidReferenceException:以下內容已計算為null 或缺失:
==> hots  [在範本「inc/right.ftl」第6 行第11 列]

--- -
提示:如果已知失敗的表達式合法地引用有時為null 或缺少的內容,請指定預設值(如myOptionalVar!myDefault),或使用 when-present ;當缺失時#if>。 (這些僅覆寫表達式的最後一步;要覆寫整個表達式,請使用括號:(myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

#


##FTL 堆疊追蹤(「~」表示與巢狀相關):
    - 失敗於:@hots  [在範本「inc/right.ftl」第 6 行第 9 列]
    - 透過以下方式到達:#include "/inc/right.ftl" [在模板「index.ftl」第52 行第13 列]
    ~ 以以下方式到達:#nested [在範本「inc/layout .ftl」中」在第25 行第5 列的巨集「layout」]
    ~ 透過下列方式到達:@layout "首頁"  [在第2 行第1 列的範本「index.ftl」]
----
    at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) ~[freemarker-2.3.28.jar:2.3.28]
   core 在freemarker.ac (UnifiedCall.java:106) ~[freemarker- 2.3.28.jar:2.3.28]
   位於freemarker.core.Environment.visit(Environment.java:330) ~[freemarker-2.3.28.jar:2.3 .28]
   位於freemarker.core. Environment.visit(Environment.java:336) ~[freemarker-2.3.28.jar:2.3.28]
   位於freemarker.core.Environment.include(Environment. :2582) ~[freemarker-2.3.28. jar:2.3.28]
   位於freemarker.core.Include.accept(Ininclude.java:171) ~[freemarker-2.3.28.jar:2.3.28]
   位於freemarker.core.Environment.visit( Environment.java:366) ~[freemarker-2.3.28.jar:2.3.28]
   位於freemarker.core.Environment.invokeNestedContent(Environment.java:Environment.invokeNestedContent(Environment.java:06618 [freemarker-2.3.28.jar:2.3. 28]
    在freemarker.core.BodyInstruction.accept(BodyInstruction..60) ~[freemarker-2.3.28.jar:2.3.28]java:60) ~[freemarker-2.3.28.jar:2.3.28]# p. .core.Environment.visit(Environment.java: 366) ~[freemarker-2.3.28.jar:2.3.28]
   位於freemarker.core.Environment.invoke(Environment.java:775) ~[freemarker-2.33 .28.jar:2.3.28]
    在freemarker.core.UnifiedCall.accept(UnifiedCall.java:83) ~[freemarker-2.3.28.jar:2.3.28]
    在freemarkmarker.core.Envimarkment. .visit(Environment.java:330) ~[ freemarker-2.3.28.jar:2.3.28]
   位於freemarker.core.Environment.visit(Environment.java:336) ~[freemarker-2.3.28.jar :2.3.28]
   位於freemarker。core.Environment.process(Environment.java:309) ~[freemarker-2.3.28.jar:2.3.28]
    在freemarker.template.Template.process(late.process(late). .java:384) ~[freemarker-2.3. 28.jar:2.3.28]
   位於org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:389) ~[spring-webmwebwebm -5.1.4.RELEASE.jar:5.1. 4.RELEASE]
    在org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:302) ~[spring-webmvc-5.1.4 .RELEASE.jar:5.1.4.RELEASE]
    在org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:253) ~[spring-webmender-5.1.4.RELE-5.ASE. :5.1.4.RELEASE]
    在org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:178) ~[spring-webmvc-5.1.4.RELEASEjar:5:178) ~[spring-webmvc-5.1.4.RELEASEjar:5. ]
    在org.springframework.web. servlet.view.AbstractView.render(AbstractView.java:316) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    在org .springframework.web.servlet.DispatcherServlet.render( DispatcherServlet.java:1370) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於org.springframework.web.servlet. .processDispatchResult(DispatcherServlet.java:1116) ~[ spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於org.springframework.web.servlet.DispatcherServlet9 ) ~[spring-webmvc-5.1.4. RELEASE.jar:5.1.4.RELEASE]
   位於org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webvcm-53. .4.RELEASE.jar:5.1.4。發佈]
    在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1 .4.RELEASE]
    在org. springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
#在javax.servlet.http.HttpServlet.service( HttpServlet.java:634) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
   位於org.springframework.web.servlet.FrameworkServlet. (FrameworkServlet.java:882) ~[spring- webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[java:741) ~[java -embed-core-9.0.14.jar: 9.0.14]
   位於org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-jar-9.0.14. :9.0.14]
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    在 org.apache.tomcat.websocket. .WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.14.jar:9.0.14]
   位於org.apache.catalina.core.ApplicationFilterChain.internalDoFilFilter(ApplicationterChain. ) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
   位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0 .14.jar:9.0.14]
   位於org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE ]
    在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]#o . .catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    在Fil .java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
   位於org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web -5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.REjavaLEASE.jarter. :5.1.4.RELEASE]
   位於org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    在org.springameFilwork.web.filter.Hidden .doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於org.springframework.web.filter.OncePerRenceFilter.doFilter(Onceter.doFilterp. ) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-Filter(ApplicationFilterChain.java:193) ~[tomcat-embed-core -9.0.14.jar:9.0.14]
   位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14 ]
    在org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASEASE]##oring. .web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
   位於org.apache.catalina.core.AppinterlicationDoterin. (ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
   位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcatcat. -embed-core-9.0.14.jar:9.0.14]
   位於org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-9.0.14.jar :9.0.14]
    在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[tomcat-embed-core-9.0.14.jar:9.0.14]##  .apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
   位於org.apache.catalina.jar:9.0.14]
   位於org.apache.catalina.core:9.0.14]
   位於org.apache.catalina.core. 。 -embed-core-9.0.14.jar:9.0.14]
   位於org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.14.jar :9.0.14]
    在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.14.jar:9.0.14]# .apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    在org.apache.coy. .java:66) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
   位於org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) ~[tomcat-embed -core-9.0.14.jar:9.0.14]
    在org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) ~[tomcat-embed-core-9.0.14core-9.0.14core .jar:9.0.14]
   位於org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    在 java.base/java.util.concurrent.ThreadPoolExecutorThworkerwfrun. :628) ~[na:na]
   位於org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.14.jar:9.0 .14]
    在java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2021-04-23 02:01:18.177 錯誤9484 - -- [nio-8080-exec-1] s.e.ErrorMvcAutoConfiguration$StaticView :無法呈現要求的錯誤頁面[/] 和例外[以下內容已評估為null 或缺失:
==> hots  [範本“inc/right.ftl”第6 行第11 列]

#----
#提示:如果已知失敗的表達式合法地引用有時為空或缺失的內容,指定預設值(如 myOptionalVar!myDefault),或使用 when-presentwhen-missing#if>。 (這些僅覆寫表達式的最後一步;要覆寫整個表達式,請使用括號:(myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

#-- --
FTL 堆疊追蹤(「~」表示與巢狀相關):
    - 失敗於:@hots  [在範本「inc/right.ftl」第6 行第9 列]
    - 已通過: #include "/inc/right.ftl" [在模板"index.ftl" 的第52 行第13 列]
    ~ 通過:#nested [在巨集“layout”中的模板“inc/layout. ftl」中]在第25 行第5 列]
    ~ 透過以下方式到達:@layout "首頁"  [在範本「index.ftl」第2 行第1 列]
----]因為回應已提交。因此,回應可能會有錯誤的狀態碼。

springboot整合freemarker報錯怎麼解決

問題原因

因為在服務中嘗試把redis邏輯程式碼運行,然後再在控制台上輸出,結果結果發現是沒有問題的,而且透過報錯資訊初步認為是前端的問題,hots沒找到,但是跟之前的一個類似功能相比較,然後透過不斷的對比,找到問題是出在配置類別。

之前一直認為template類別中的getname方法可以完成map功能

springboot整合freemarker報錯怎麼解決

其實需要在FreemarkerConfig類別裡面進行宣告

解決方法

再FreemarkerConfig類別先透過@Autowired導入模板類,使用configuration.setSharedVariable(“hots”, hotsTemplate);進行聲明,缺少這一步驟會使得導入對於< ;@hots>然後;這個標籤無法識別。

springboot freemarker基礎配置及使用

1.基礎配置

1.1引入依賴

<!-- 引入freemarker模板引擎的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

1.2在application.properties設定檔中加入以下配置:

# 是否开启thymeleaf缓存,本地为false,生产建议为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.allow-request-override=false
spring.freemarker.check-template-location=true
#类型
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
#
#文件后缀
spring.freemarker.suffix=.ftl
#路径 .ftl文件就创建在templates下面或者子目录
spring.freemarker.template-loader-path=classpath:/templates/

2.基礎使用

首先我在controller類別中編寫了一個測試介面用於測試使用,編寫的內容如下

@Controller
public class FreeMarkerController {

    Map<String ,Object> map = new HashMap<>();
    List<Object> list = new ArrayList();
    @GetMapping("/freemaker/{id}/{name}")
    public String demo(@PathVariable("id")String id ,@PathVariable("name") String name,Model model){

        map.clear();
        map.put("id",id);
        map.put("name",name);
        list.add(2);
        list.add(4);
        map.put("aa",null);
        model.addAttribute("map",map);
        model.addAttribute("list",list);
        model.addAttribute("date",new Date());
        return "index";
    }
}

以下所有變數都有上面介面提供

##2.1呼叫map類型數據,實體屬性類別也可以使用此格式呼叫

/*可直接获取id对应的v值*/
id:${map.id}
name:${map.name}

2.2集合調用,set集合也可用此格式調用相應的元素

list01:${list[0]}
list02:${list[1]}

2.3字串拼接的兩種方法

${"你好啊${map.name}"}
${"你好啊"+map.name}

2.4FreeMarker表達式中支援「 」 、「-」、「*」、「/」、「%」運算子

${list[1]+list[0]}
${list[1]-list[0]}
${list[1]*list[0]}
${list[1]/list[0]}
${list[1]%list[0]}

2.5表達式中支援的比較運算子有下列幾種:

1。 =(或==):判斷兩個值是否一致;
2. !=:判斷兩個值是否不一致;
註:=和!=可以使用字串、數值和日期的比較,但兩邊的資料型態必須相同。而且FreeMarker的比較是精確比較,不會忽略大小寫及空格。
3. >(或gt):大於
4. >=(或gte):大於等於
5。 6. 註:上面這些比較運算子可以用於數字和日期,但不能用於字串。大多數時候,使用gt比>有更好的效果因為, FreeMarker會把>解釋成標籤的結束字元。可以使用音符來避免這種類型

2.6時間格式轉換

${date?string("yyyy-MM-dd")}

2.7支援邏輯表達式

##FreeMarker支援邏輯損壞但只支援布林型邏輯損壞兩個值進行比較損壞的時候需要添加定時器才能進行邏輯損壞,一般用於指令中

FreeMarker支持逻辑运算但是只支持布尔型逻辑运算两个值进行比较运算的的时候需要添加括号才能进行逻辑运算,一般用于指令中
1. &&: 逻辑与;
2. ||:逻辑或;
3. !:逻辑非
逻辑运算符只能用于布尔值。

2.8FreeMarker无法理解null值

FreeMarker的变量必须赋值,否则就会抛出异常。而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
FreeMarker提供两个运算符来避免空值:
1.!运算
1.1若是msg不存在不报异常默认空值,若是不使用!会报异常

${msg!}
1.2若是存在则输出,若是不存在则默认为abc

${map.a!"abc"}

2.??返回布尔值一般用在指令中下面会有引用此处不解释

2.9 if指令

<#if map.aa?? >
    存在
    <#else >
    不存在
</#if>
<br>
<#if (list[0]>=3) >
    优秀
    <#elseif (list[0]>=2)>
    良好
    <#else >
    差劲
</#if>

2.10 list指令 遍历

<#list list as li>
    ${li}<br>
</#list>

以上是springboot整合freemarker報錯怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
平台獨立性如何使企業級的Java應用程序受益?平台獨立性如何使企業級的Java應用程序受益?May 03, 2025 am 12:23 AM

Java在企業級應用中被廣泛使用是因為其平台獨立性。 1)平台獨立性通過Java虛擬機(JVM)實現,使代碼可在任何支持Java的平台上運行。 2)它簡化了跨平台部署和開發流程,提供了更大的靈活性和擴展性。 3)然而,需注意性能差異和第三方庫兼容性,並採用最佳實踐如使用純Java代碼和跨平台測試。

考慮到平台獨立性,Java在物聯網(物聯網)設備的開發中扮演什麼角色?考慮到平台獨立性,Java在物聯網(物聯網)設備的開發中扮演什麼角色?May 03, 2025 am 12:22 AM

JavaplaysigantroleiniotduetoitsplatFormentence.1)itallowscodeTobewrittenOnCeandrunonVariousDevices.2)Java'secosystemprovidesuseusefidesusefidesulylibrariesforiot.3)

描述一個方案,您在Java中遇到了一個特定於平台的問題以及如何解決。描述一個方案,您在Java中遇到了一個特定於平台的問題以及如何解決。May 03, 2025 am 12:21 AM

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java平台獨立對開發人員有什麼好處?Java平台獨立對開發人員有什麼好處?May 03, 2025 am 12:15 AM

Java'splatFormIndenceistificantBecapeitAllowSitallowsDevelostWriTecoDeonCeandRunitonAnyPlatFormwithAjvm.this“ writeonce,runanywhere”(era)櫥櫃櫥櫃:1)交叉plat formcomplibility cross-platformcombiblesible,enablingDeploymentMentMentMentMentAcrAptAprospOspOspOssCrossDifferentoSswithOssuse; 2)

將Java用於需要在不同服務器上運行的Web應用程序的優點是什麼?將Java用於需要在不同服務器上運行的Web應用程序的優點是什麼?May 03, 2025 am 12:13 AM

Java適合開發跨服務器web應用。 1)Java的“一次編寫,到處運行”哲學使其代碼可在任何支持JVM的平台上運行。 2)Java擁有豐富的生態系統,包括Spring和Hibernate等工具,簡化開發過程。 3)Java在性能和安全性方面表現出色,提供高效的內存管理和強大的安全保障。

JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?May 02, 2025 am 12:25 AM

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的較新版本如何解決平台特定問題?Java的較新版本如何解決平台特定問題?May 02, 2025 am 12:18 AM

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

說明JVM執行的字節碼驗證的過程。說明JVM執行的字節碼驗證的過程。May 02, 2025 am 12:18 AM

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。