jsp 相关问题

JSP(JavaServer Pages)是一种在服务器上运行的基于Java的视图技术,它允许您在(客户端语言,如HTML,CSS,JavaScript等)中编写模板文本,并与后端Java代码进行交互。

如何在Struts 2 <s:iterator>标签中添加条件?

我想在评级值小于或等于 2 时突出显示一行。我无法使用 标签来获取结果。请告诉我如何在 JSP 页面中添加条件? <...

回答 4 投票 0

如何在Struts 2 <s:if>标签中添加条件?

我想在评级值小于或等于 2 时突出显示一行。我无法使用 标签来获取结果。请告诉我如何在 JSP 页面中添加条件? <...

回答 4 投票 0

请求的列表键“国家”无法解析为集合/数组/映射/枚举/迭代器类型。示例:人或人。{name}

我有一个需要使用 Struts 2 标签填充的下拉列表。 我有一个需要使用 Struts 2 <s:select> 标签填充的下拉列表。 <s:select label="Country" headerKey="-1" headerValue="Select Country" list="countries" listKey="key" listValue="label" name="searchForm.custCountry"/> 在我的操作类中,我有以下声明,后跟 getter 和 setter。 ArrayList<DropDown> countries = new ArrayList<DropDown>(); 我遇到了以下异常。 错在哪里? SEVERE: Servlet.service() for servlet jsp threw exception tag 'select', field 'list', name 'searchForm.custCountry': The requested list key 'countries' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location] at org.apache.struts2.components.Component.fieldError(Component.java:240) at org.apache.struts2.components.Component.findValue(Component.java:333) at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:80) at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:105) at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:902) at org.apache.struts2.components.UIBean.end(UIBean.java:544) at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42) at org.apache.jsp.accountSearchDtls_jsp._jspx_meth_s_005fselect_005f0(accountSearchDtls_jsp.java:979) at org.apache.jsp.accountSearchDtls_jsp._jspx_meth_s_005fdiv_005f0(accountSearchDtls_jsp.java:935) at org.apache.jsp.accountSearchDtls_jsp._jspService(accountSearchDtls_jsp.java:521) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:745) 这是我获取下拉列表数据的方法。我想这已经足够了,如果不让我知道的话。 public ArrayList<DropDown> getCountrydd() { ArrayList<DropDown> countrydd = new ArrayList<DropDown>(); try { OraConn conn = new OraConn(); conn.getConnection(); cstmt = conn.setProc("call mgm.getCountry(?)"); cstmt.registerOutParameter(1, OracleTypes.CURSOR); cstmt.execute(); rs = (OracleResultSet)cstmt.getObject(1); countrydd = rsToDropDown(rs); } catch (Exception e) { e.printStackTrace(); //log.error("***getDSdropdowns*** "); } finally { closeORAConnection(); } return countrydd; } 您需要更改代码来填充列表 public ArrayList<DropDown> getCountrydd() { List<DropDown> countrydd = new ArrayList<DropDown>(); OraConn oraConn = new OraConn(); Connection conn = null; CallableStatement cstmt = null; ResultSet rs = null; try { conn = oraConn.getConnection(); cstmt = conn.prepareCall("{call mgm.getCountry(?)}"); cstmt.registerOutParameter(1, OracleTypes.CURSOR); cstmt.executeUpdate(); rs = (ResultSet)cstmt.getObject(1); rsToDropDown(rs, countrydd); } catch (Exception e) { e.printStackTrace(); //log.error("***getDSdropdowns*** "); } finally { if (rs != null) rs.close(); if (cstmt!= null) cstmt.close(); if (conn != null) conn.close(); } return countrydd; } 我发现即使用户为空,我也会用国家/地区值填充组合框或下拉列表,因此,当我单击“创建新用户”按钮时,我得到了这些异常。现在我更改了代码,这就是现在的样子: public String getProfile() throws Exception { user_name =(String) sessionMap.get("userid") ; MgmService service = new MgmService(); userForm = new User(); userForm = service.getUsersProfile(user_name); if(searched_user_name!=null){ userForm = service.getUsersProfile(searched_user_name); countries= service.getCountrydd(); //This keep the content of the combobox by default on the list return "createEditUser"; } else if(userForm!=null) { return "success"; } else { addActionError("Invalid Login."); return "success"; } } 这是我之前的错误代码...... public String getProfile() throws Exception { user_name =(String) sessionMap.get("userid") ; MgmService service = new MgmService(); userForm = new User(); userForm = service.getUsersProfile(user_name); countries= service.getCountrydd(); //This keep the content of the combobox by default on the list if(searched_user_name!=null){ userForm = service.getUsersProfile(searched_user_name); return "createEditUser"; } else if(userForm!=null) { return "success"; } else { addActionError("Invalid Login."); return "success"; } }

回答 2 投票 0

如何显示图像并将CSS文件链接到JSP页面

我正在开发 Spring、Hibernate、JSP 应用程序。我正在尝试在 JSP 页面上显示图像。该图像不显示在浏览器中。我也无法将我的 CSS 链接到 JSP 页面。 我的...

回答 2 投票 0

如何将参数从 <s:iterator> 标签内的文本字段传递到 Struts 2 中的操作?

我有一个带有 标记列表的 JSP,该列表使用 getter/setter 迭代在操作中创建的对象。 我能够将映射值从操作拉到 我有一个带有 <s:iterator> 标签列表的 JSP,它使用 getter/setter 迭代在操作中创建的对象。 我能够将映射值从操作拉到 <s:iterator> 标签的文本字段,现在我希望能够将文本字段值从 <s:iterator> 传递回操作类以映射对象,但我意识到它不会调用我的 setter 方法。 这是我的JSP: <s:iterator status="stat" value="parameterList" > <tr id="<s:property value="#stat.index"/>"> <td><s:textfield id="parameterList[%{#stat.index}].queryParameter" name="parameterList[%{#stat.index}].queryParameter" cssClass="size30" labelposition="left" ></s:textfield> </td> <td><s:textfield id="parameterList[%{#stat.index}].parameterValue" name="parameterList[%{#stat.index}].parameterValue" cssClass="size30" labelposition="left" ></s:textfield> </td> </tr> </s:iterator> 这是该操作的片段: private List<QueryParameter> parameterList = new ArrayList<QueryParameter>(); public void setParameterList(List<QueryParameter> parameterList) { this.parameterList = parameterList; } public DQA getDqaObject() { return dqa; } 当我导航到 JSP 时,getter 被调用得很好,但是当我从 JSP 提交表单时,我期望放入 <s:iterator> 标记内的文本字段中的值应该传递并更新操作类中的对象,但是setter 没有被调用。 我解决了这个问题,问题是在我的 getter 中(我忘记在问题中发布)有一些逻辑阻止 getter 继续实际调用对象 setter 来设置参数。 OGNL 在创建新对象时不会调用 setter 方法。如果您想更新现有对象,也不需要它。它应该在填充操作之前初始化。 prepare拦截器可以调用您的操作,如果它实现了Preparable来执行prepare()方法,您可以在其中初始化要更新的对象。 如果您需要一个参数来从数据库检索对象,您可以使用paramsPrepareParams拦截器的堆栈。您可以查看说明在 Struts 2 中绑定后更改参数。 也不要使用 ModelDriven 接口,因为默认情况下它无法与上述堆栈一起正常工作。它需要重新配置默认堆栈以使模型在 params 拦截器 触发之前推送,否则您必须手动处理参数,即来自操作上下文或已弃用的 ParametersAware。

回答 2 投票 0

是否可以为放置在 Tomcat 中的 web 应用程序之外的 JSP 提供服务

我在 Tomcat 的应用程序中使用 Struts 2。 我通过将应用程序的静态资源放置在 webapps 之外并在 server.xml 中进行设置来提供它们。 现在,我想为 JSP 提供服务...

回答 2 投票 0

如何在Java中自定义异常消息中换行?

我需要在自定义异常抛出的消息之间换行。 我正在使用 Struts 2 addActionError(),错误消息将显示在 JSP 上。 这是我的 Java 代码: 如果(结果_Of_S...

回答 1 投票 0

如何使用 JavaScript 将输入隐藏字段的值设置为在另一个输入文本字段中输入的值?

我有一个输入文本字段(名称:qtyText),用户可以在其中输入值。我想使用 JavaScript 将此值设置为另一个隐藏字段(名称:qtyTextHidden)的值。我怎么去...

回答 3 投票 0

为什么PreparedStatement给出索引超出范围的错误? [已关闭]

我在 PostgreSQL 中创建了一个有 4 列的表,想要从该表的第 1 列和第 4 列验证我的登录,但它给出了索引超出范围错误。 以下代码在我的

回答 1 投票 0

使用<c:forEach>填充Struts中<html:select>标签的选项

我正在尝试使用 标签在 标签中循环。 我正在尝试使用 <c:forEach> 标签在 <html:select> 标签中循环。 <html:select property="year" > <s:iterator var="i" begin="${1}" end="${monthlyChargeForm.currentYear - 2000}" > <s:set var="counter" value="${monthlyChargeForm.currentYear}"/> <html:option value="${counter}"> <c:out value="${counter}"/> </html:option> <s:set var="counter" value="${counter-1}"/> </s:iterator> </html:select> 我试图在下拉列表中列出从当年到 YEAR : 2000 的所有年份。 但我得到的下拉菜单是空的。 我使用过的Action类代码: // monthlyChargeForm.setCurrentYear(now.get(Calendar.YEAR) ); 获取当前年份。 public class MonthlyChargeAction extends Action { private ActionMessages messages; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception { ServletContext context = getServlet().getServletContext(); BACUtils bacUtils = new BACUtils(); String sessionStatus = HtmlBean.isSessionOut(request.getSession(false), context); if(!Constants.SUCCESS_STATUS.equals(sessionStatus)) { return mapping.findForward("sessionOut"); } String accesssStatus = HtmlBean.isSessionValid(request.getSession(false), context, Properties.ACCESS_PROFILE[8][0]); if(!Constants.SUCCESS_STATUS.equals(accesssStatus)) { return mapping.findForward("sessionOut"); } MonthlyChargeForm monthlyChargeForm = (MonthlyChargeForm)form; Reports reports = new Reports(); String sUser =(String) request.getSession().getAttribute("USERID"); String returnVal = ""; int i = 0; try { monthlyChargeForm.setFromDate(bacUtils.getDate()); monthlyChargeForm.setToDate(bacUtils.getDate()); Calendar now = Calendar.getInstance(); String fromDate = monthlyChargeForm.getFromDate(); String toDate = monthlyChargeForm.getToDate(); String curentDate = bacUtils.getDate(); monthlyChargeForm.setCurrentYear(now.get(Calendar.YEAR) ); System.out.println("Current Year :::::::::" + monthlyChargeForm.getCurrentYear()); AuditTrial.insertLog(5,sUser,null,"General Reports Module Loaded Successfully",(String) request.getSession().getAttribute("OPER_TYPE"),"S",request.getRemoteAddr(),context); if(monthlyChargeForm.getPageIndex() == null || monthlyChargeForm.getPageIndex().trim().length() == 0) monthlyChargeForm.setPageIndex(Integer.toString(BACUtils.getIntVal( monthlyChargeForm.getPageIndex()))); if(monthlyChargeForm.getMonth()!=null && monthlyChargeForm.getYear()!=null ) { monthlyChargeForm.setMonthlyChargeReport( reports.getMonthlyChargeData(monthlyChargeForm, 10, context)); } } catch (Exception e) { e.printStackTrace(); } System.out.println(Constants.SUCCESS_MAPPING); return mapping.findForward(Constants.SUCCESS_MAPPING); } 如果您尝试使用 foreach 循环,那么您可以尝试 JSTL 核心标签库中的 forEach 标签。 <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html:select property="year" > <c:forEach varStatus="i" begin="${monthlyChargeForm.currentYear}" end="2000" step="-1"> <html:option value="${i.index}"> <c:out value="${i.index}"/> </html:option> </c:forEach> </html:select>

回答 1 投票 0

为什么一个页面包含在Struts中JSP会执行多次?

我尝试在 Struts 中运行以下代码并收到错误: <%@page contentType="text/html" pageEncoding="UTF-8"%> 我尝试在 Struts 中运行以下代码并收到错误: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <jsp:include page="/Shop_login.jsp"></jsp:include> <head>Welcome To My shop application </head> <body> User Name:<html:input text="first_name"> </html:input> Password:<html:password text="password"> </html:password> </body> </html> 输出为: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: ... 如果您使用 JSTL,您也可以在 JSP 中拥有这些标记库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %> <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %> 文件中没有更多内容,只有这些代码片段 然后使用 <%@ include file="/tags/taglibs.jsp" %> 在页面顶部,您可以使用定义下方的标签。 例如,您可以将其他 JSP 片段包含在 JSTL 中 <c:import url="/pages/page.jsp"/> 或使用 JSP 指令 <jsp:include page="/pages/page.jsp"/> 并且不要在其内部使用相同的片段,它可能会导致从代码编译的 servlet 中出现递归调用。

回答 1 投票 0

为什么JSP在Struts中执行多次登录到控制台?

我尝试在 Struts 中运行以下代码并收到错误: <%@page contentType="text/html" pageEncoding="UTF-8"%> 我尝试在 Struts 中运行以下代码并收到错误: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <jsp:include page="/Shop_login.jsp"></jsp:include> <head>Welcome To My shop application </head> <body> User Name:<html:input text="first_name"> </html:input> Password:<html:password text="password"> </html:password> </body> </html> 输出为: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: ... 如果您使用 JSTL,您也可以在 JSP 中拥有这些标记库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %> <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %> 文件中没有更多内容,只有这些代码片段 然后使用 <%@ include file="/tags/taglibs.jsp" %> 在页面顶部,您可以使用定义下方的标签。 例如,您可以将其他 JSP 片段包含在 JSTL 中 <c:import url="/pages/page.jsp"/> 或使用 JSP 指令 <jsp:include page="/pages/page.jsp"/> 并且不要在其内部使用相同的片段,它可能会导致从代码编译的 servlet 中出现递归调用。

回答 1 投票 0

Struts:JSP页面中的多次执行

我尝试在 Struts 中运行以下代码并收到错误: <%@page contentType="text/html" pageEncoding="UTF-8"%> 我尝试在 Struts 中运行以下代码并收到错误: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <jsp:include page="/Shop_login.jsp"></jsp:include> <head>Welcome To My shop application </head> <body> User Name:<html:input text="first_name"> </html:input> Password:<html:password text="password"> </html:password> </body> </html> 输出为: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: Welcome To My shop application User Name: Password: ... 如果您使用 JSTL,您也可以在 JSP 中拥有这些标记库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %> <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %> 文件中没有更多内容,只有这些代码片段 然后使用 <%@ include file="/tags/taglibs.jsp" %> 在页面顶部,您可以使用定义下方的标签。 例如,您可以将其他 JSP 片段包含在 JSTL 中 <c:import url="/pages/page.jsp"/> 或使用 JSP 指令 <jsp:include page="/pages/page.jsp"/> 并且不要在其内部使用相同的片段,它可能会导致从代码编译的 servlet 中出现递归调用。

回答 1 投票 0

带选择框的 Struts 2 jQuery 自动完成器不会填充任何值

我在我的 Struts 2 应用程序中使用了 Struts 2 jQuery 自动完成器。 这是我的代码: 联合应用程序: 我在我的 Struts 2 应用程序中使用了 Struts 2 jQuery autocompleter。 这是我的代码: JSP: <s:form id="frm_demo" theme="simple" action="ManagersAutoCompleter1"> <s:url var="remoteurl" action="test" /> <sj:autocompleter href="%{remoteurl}" id="echo3" name="echo" list="itemList" listKey="id" listValue="name" emptyOption="true" headerKey="-1" headerValue="Please Select a Language" selectBox="true" /> <s:submit value="submit" /> </s:form> struts.xml: <action name="test" class="test.TestAction" method="populate"> <result type="json"> </result> </action> 动作类: public String populate() throws Exception { itemList = new ArrayList<ListValue>(); itemList.add(new ListValue("Php", "Php")); itemList.add(new ListValue("Java", "Java")); itemList.add(new ListValue("Mysl", "Mysl")); return SUCCESS; } //getter setter for itemList 列表类: public class ListValue { private String id; private String name; public ListValue(String id, String name) { this.id = id; this.name = name; } //getter setter methods 但是这个 Struts2 jQuery autocompleter 不起作用。它不填充任何值。 做这个 <s:url id="remoteurl" action="test"/> <sj:select id="customersjsonlstid" name="echo" label="Handle a List" href="%{remoteurl}" list="itemList" listValue="name" listKey="id" autocomplete="true" loadMinimumCount="2" id="echo3"/> 而不是这个: <sj:autocompleter href="%{remoteurl}" id="echo3" name="echo" list="itemList" listKey="id" listValue="name" emptyOption="true" headerKey="-1" headerValue="Please Select a Language" selectBox="true" /> 并确保您从操作类返回列表。 要检查这一点,请使用 IDE 调试器或 System.out.print 等执行此操作。 ex... ------------- ------------ itemList.add(new ListValue("Mysl", "Mysl") ); System.out.println("Size of my list="+itemList.size()); return SUCCESS; } 你还应该在你的动作类中定义 getter 和 setter private List itemList; public List getItemList() { return itemList; } public void setItemList(List itemList) { this.itemList = itemList; } 这是错误的: <sj:autocompleter href="%{remoteurl}" id="lst" name="lst" list="itemList" listValue="name" listKey="id" selectBox="true" /> 您正在向自动完成器提供 Map,而不是您自己构建的自定义对象。 HashMap 没有任何 name 和 id 字段,而是具有 key 和 value 字段。 首先更改它,看看它是否有效: <sj:autocompleter href="%{remoteurl}" id="lst" name="lst" list="itemList" listValue="value" listKey="key" selectBox="true" /> 您输入了未引用的错误属性。 <s:url id="remoteurl" action="test" /> 应该是 <s:url var="remoteurl" action="test" /> 使用列表项bean类 public class ListValue { private String id; private String name; ... } public String populate() throws Exception { itemList.add(new ListValue("Php", "Php")); itemList.add(new ListValue("Java","Java") ); itemList.add(new ListValue("Mysl", "Mysl") ); return SUCCESS; } 假设已添加构造函数和修改器。

回答 3 投票 0

使用自动装箱时JSP编译错误

在 Tomcat 7.0.54 中执行以下 JSP 内容时出现以下错误: <% Object one = new Long(1); Long value = Boolean.TRUE ? (Long)one : -1l; %> 错误: javax.servlet.ServletExce...

回答 3 投票 0

Struts 2 标签中的 HTML 标签自动编码为 UTF-8

我在 Struts 2 标签中将 HTML 标签自动编码为 UTF-8 时遇到一些问题。 我想将一个包含 HTML 标签的值从操作类传递到 JSP 页面,但在 Struts 标签中该值是自动的...

回答 2 投票 0

Struts 2 标签中的 HTML 标签自动编码为 UTF-8

我在 Struts 2 标签中将 HTML 标签自动编码为 UTF-8 时遇到一些问题。 我想将一个包含 HTML 标签的值从操作类传递到 JSP 页面,但在 Struts 标签中该值是自动的...

回答 2 投票 0

如何访问Struts标签的嵌套标签?

我正在使用以下 JavaScript 代码来设置元素的值。 document.getElementById('alert['+i+']').innerHTML = "alert"; 该元素嵌套在 Struts set 标记中。 (ID 我...

回答 1 投票 0

如何在 Struts 2 中默认选中 HTML 输入复选框?

我在JSP中有一个复选框,它由一个HashMap组成,例如, “1”、“姓名” “2”、“年龄” “3”、“性别” 现在,我想要...

回答 1 投票 0

JSP 中类似 PHP 的输出缓冲(让子模板影响主模板)

在我的网站中,我有一个主 JSP 模板: ... ... ...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.