- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我收到一个错误,如 Component ID component has already been found in the view inside tree table column tag with id=col1。对于这个单个 xhtml 文件,我有两个托管 Bean,并且都在 session 范围内。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Category and Brand Manage Page</title>
</h:head>
<h:body>
<ui:composition template="/templates/layout.xhtml">
<ui:define name="content">
<h:form id="productform" enctype="multipart/form-data" rendered="#{loginManagedBean.isLoggedIn}">
<p:growl id="messages" autoUpdate="true" redisplay="false" showDetail="true"/>
<p:panel header="Brand Management" id="brandpanel">
<h:panelGrid columns="2" cellspacing="20">
<p:outputLabel value="Branch Name"/>
<p:selectOneMenu id="branchname" value="#{brandManagedBean.branchId}" style="width: 200px;">
<f:selectItem itemLabel="Select Branch" itemValue=""/>
<f:selectItems value="#{brandManagedBean.branchNamesMap}"/>
<p:ajax listener="#{brandManagedBean.selectBrands()}" update="brandpanel"/>
</p:selectOneMenu>
<p:outputLabel value="Brand Name"/>
<p:selectOneMenu id="brandname" value="#{brandManagedBean.id}" style="width: 200px;">
<f:selectItem itemLabel="Select Brands" itemValue=""/>
<f:selectItems value="#{brandManagedBean.brandNamesMap}"/>
<p:ajax event="change"/>
</p:selectOneMenu>
<p:outputLabel value="New or update brand name"/>
<p:inputText value="#{brandManagedBean.name}">
<p:ajax event="change"/>
</p:inputText>
</h:panelGrid>
<h:panelGrid columns="3">
<p:commandButton update="brandpanel" actionListener="#{brandManagedBean.insertBrand()}" value="Add"/>
<p:commandButton update="brandpanel" actionListener="#{brandManagedBean.updateBrand()}" value="Update"/>
<p:commandButton update="brandpanel" actionListener="#{brandManagedBean.deleteBrand()}" value="Delete"/>
</h:panelGrid>
</p:panel>
<p:panel header="Category Management" id="categorypanel">
<h:panelGrid columns="2" cellspacing="20">
<p:outputLabel value="Branch Name"/>
<p:selectOneMenu id="categorybranchname" value="#{categoryManagedBean.branchId}" style="width: 200px;">
<f:selectItem itemLabel="Select Branch" itemValue=""/>
<f:selectItems value="#{categoryManagedBean.branchNamesMap}"/>
<p:ajax listener="#{categoryManagedBean.selectFloors()}" update="categorypanel"/>
</p:selectOneMenu>
<p:outputLabel value="Floor Name"/>
<p:selectOneMenu id="categoryfloorname" value="#{categoryManagedBean.floorId}" style="width: 200px;">
<f:selectItem itemLabel="Select Floor" itemValue=""/>
<f:selectItems value="#{categoryManagedBean.floorsMap}"/>
<p:ajax listener="#{categoryManagedBean.selectCategories()}" update="categorypanel"/>
<p:ajax listener="#{categoryManagedBean.loadTreeTable()}" update="categorytree"/>
</p:selectOneMenu>
</h:panelGrid>
<h:panelGrid columns="4">
<p:outputLabel value="Category Name"/>
<p:selectOneMenu id="categoryname" value="#{categoryManagedBean.catId}" style="width: 200px;">
<f:selectItem itemLabel="Select Category" itemValue=""/>
<f:selectItems value="#{categoryManagedBean.categoryMap}"/>
<p:ajax listener="#{categoryManagedBean.selectSubCategory1()}" update="categorypanel"/>
</p:selectOneMenu>
<p:outputLabel value="New Category Name"/>
<p:inputText value="#{categoryManagedBean.catName}">
<p:ajax event="change"/>
</p:inputText>
</h:panelGrid>
<h:panelGrid columns="4">
<p:outputLabel value="Item Name"/>
<p:selectOneMenu id="subcategoryname" value="#{categoryManagedBean.subcat1Id}" style="width: 200px;">
<f:selectItem itemLabel="Select Item" itemValue=""/>
<f:selectItems value="#{categoryManagedBean.subCategory1Map}"/>
<p:ajax event="change"/>
</p:selectOneMenu>
<p:outputLabel value="New Item Name"/>
<p:inputText value="#{categoryManagedBean.subcat1Name}">
<p:ajax event="change"/>
</p:inputText>
</h:panelGrid>
<h:panelGrid columns="3">
<p:commandButton update="categorypanel" actionListener="#{categoryManagedBean.insertCategory()}" value="Add"/>
</h:panelGrid>
<p:treeTable id="categorytree" value="#{categoryManagedBean.root}" var="catdto"
selectionMode="single" selection="#{categoryManagedBean.selectNode}">
<f:facet id="face1" name="header">
Categories
</f:facet>
<p:column id="col1">
<f:facet name="header" id="face2">
Category Name
</f:facet>
<h:outputLabel id="out1" value="#{catdto.name}"/>
</p:column>
<p:column id="col2">
<f:facet name="header" id="face3">
Edit
</f:facet>
<p:commandLink id="com1" update=":productform:documentPanel" oncomplete="PF('documentDialog').show()" title="Update Form" styleClass="ui-icon ui-icon-pencil" >
<f:setPropertyActionListener value="#{catdto}" target="#{categoryManagedBean.selectedCategoryDto}" />
</p:commandLink>
</p:column>
<p:column id="col3">
<f:facet name="header" id="face4">
Delete
</f:facet>
<p:commandLink id="com2" action="#{categoryManagedBean.deleteCategory(category)}" type="button"
style="float: right; background-image: url('../resources/images/delete.jpg'); background-repeat: no-repeat;
background-size: 100% 100%; background-origin : border-box; width: 30px; height: 20px;">
</p:commandLink>
</p:column>
</p:treeTable>
</p:panel>
<p:dialog id="dialog" header="Update Form" showEffect="fade" widgetVar="documentDialog" modal="false" maximizable="true" minimizable="true">
<p:outputPanel id="documentPanel">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="name" value="Category: " />
<p:inplace id="basic">
<h:inputText id="name" value="#{categoryManagedBean.selectedCategoryDto.name}" style="font-weight:bold" />
</p:inplace>
<h:panelGrid columns="2" style="margin-left: 100px">
<p:commandButton action="#{categoryManagedBean.updateCategory()}" value="Update" ajax="false" update=":categorypanel"/>
<p:commandButton action="#{categoryManagedBean.clear}" value="Clear" id="btnclear" ajax="false" />
</h:panelGrid>
</h:panelGrid>
</p:outputPanel>
</p:dialog>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
堆栈跟踪
SEVERE: JSF1007: Duplicate component ID productform:categorytree:col1 found in view.
Dec 12, 2013 5:27:01 PM com.sun.faces.util.Util checkIdUniqueness
SEVERE: +id: j_id1
type: javax.faces.component.UIViewRoot@9ce387
+id: javax_faces_location_HEAD
type: com.sun.faces.component.ComponentResourceContainer@1f54217
+id: j_id2
type: javax.faces.component.UIOutput@c5f91c
+id: j_id3
type: javax.faces.component.UIOutput@165c08a
+id: j_id4
type: javax.faces.component.UIOutput@143b527
+id: j_id5
type: javax.faces.component.UIOutput@2a237a
+id: j_id6
type: javax.faces.component.UIOutput@7f29f4
+id: j_id7
type: javax.faces.component.UIOutput@9b66f1
+id: j_id8
type: javax.faces.component.UIOutput@837332
+id: j_id9
type: javax.faces.component.UIOutput@1fffbc8
+id: j_idt1
type: <html xmlns="http://www.w3.org/1999/xhtml">
+id: j_idt2
type: javax.faces.component.UIOutput@1ddf77
+id: j_idt3
type:
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<title>Madharsha Control Panel Page</title>
+id: j_idt4
type: javax.faces.component.html.HtmlBody@14ba6a4
+id: j_idt5
type: org.primefaces.component.layout.Layout@1a96d23
+id: header
type: org.primefaces.component.layout.LayoutUnit@3c41cb
+id: j_idt6
type: org.primefaces.component.outputlabel.OutputLabel@39137
+id: j_idt7
type: org.primefaces.component.layout.LayoutUnit@32e320
+id: layoutform
type: javax.faces.component.html.HtmlForm@dd4f1b
+id: rootmenu
type: org.primefaces.component.menubar.Menubar@1747f49
+id: homemenu
type: org.primefaces.component.menuitem.UIMenuItem@150d2fe
+id: mastermenu
type: org.primefaces.component.submenu.UISubmenu@14c3f17
+id: j_idt8
type: org.primefaces.component.menuitem.UIMenuItem@c23503
+id: j_idt9
type: org.primefaces.component.menuitem.UIMenuItem@265e80
+id: tabletmenu
type: org.primefaces.component.menuitem.UIMenuItem@1063704
+id: logoutmenu
type: org.primefaces.component.menuitem.UIMenuItem@105ea2f
+id: loginmenu
type: org.primefaces.component.menuitem.UIMenuItem@151e258
+id: productform
type: javax.faces.component.html.HtmlForm@e33152
+id: messages
type: org.primefaces.component.growl.Growl@1bb22d9
+id: brandpanel
type: org.primefaces.component.panel.Panel@ed0cd7
+id: j_idt10
type: javax.faces.component.html.HtmlPanelGrid@e60409
+id: j_idt11
type: org.primefaces.component.outputlabel.OutputLabel@11325cd
+id: branchname
type: org.primefaces.component.selectonemenu.SelectOneMenu@16e471
+id: j_idt12
type: javax.faces.component.UISelectItem@efdaaa
+id: j_idt13
type: javax.faces.component.UISelectItems@fcd37b
+id: j_idt14
type: org.primefaces.component.outputlabel.OutputLabel@a04e7e
+id: brandname
type: org.primefaces.component.selectonemenu.SelectOneMenu@814915
+id: j_idt15
type: javax.faces.component.UISelectItem@1e52afd
+id: j_idt16
type: javax.faces.component.UISelectItems@697520
+id: j_idt17
type: org.primefaces.component.outputlabel.OutputLabel@1888b29
+id: j_idt18
type: org.primefaces.component.inputtext.InputText@1686d07
+id: j_idt19
type: javax.faces.component.html.HtmlPanelGrid@ce1366
+id: j_idt20
type: org.primefaces.component.commandbutton.CommandButton@15b920e
+id: j_idt21
type: org.primefaces.component.commandbutton.CommandButton@d1de09
+id: j_idt22
type: org.primefaces.component.commandbutton.CommandButton@482a86
+id: categorypanel
type: org.primefaces.component.panel.Panel@1dfcbc3
+id: j_idt23
type: javax.faces.component.html.HtmlPanelGrid@1baa99d
+id: j_idt24
type: org.primefaces.component.outputlabel.OutputLabel@1d590a3
+id: categorybranchname
type: org.primefaces.component.selectonemenu.SelectOneMenu@afcd9
+id: j_idt25
type: javax.faces.component.UISelectItem@15e0b9b
+id: j_idt26
type: javax.faces.component.UISelectItems@14bfd33
+id: j_idt27
type: org.primefaces.component.outputlabel.OutputLabel@1dc4c0b
+id: categoryfloorname
type: org.primefaces.component.selectonemenu.SelectOneMenu@485e7
+id: j_idt28
type: javax.faces.component.UISelectItem@f326a7
+id: j_idt29
type: javax.faces.component.UISelectItems@16ed6d9
+id: j_idt30
type: javax.faces.component.html.HtmlPanelGrid@1db4fa7
+id: j_idt31
type: org.primefaces.component.outputlabel.OutputLabel@14a8a00
+id: categoryname
type: org.primefaces.component.selectonemenu.SelectOneMenu@aa4749
+id: j_idt32
type: javax.faces.component.UISelectItem@12e467c
+id: j_idt33
type: javax.faces.component.UISelectItems@11589f6
+id: j_idt34
type: org.primefaces.component.outputlabel.OutputLabel@1147608
+id: j_idt35
type: org.primefaces.component.inputtext.InputText@511e57
+id: j_idt36
type: javax.faces.component.html.HtmlPanelGrid@19eef40
+id: j_idt37
type: org.primefaces.component.outputlabel.OutputLabel@16d756e
+id: subcategoryname
type: org.primefaces.component.selectonemenu.SelectOneMenu@138c603
+id: j_idt38
type: javax.faces.component.UISelectItem@50093a
+id: j_idt39
type: javax.faces.component.UISelectItems@8dea14
+id: j_idt40
type: org.primefaces.component.outputlabel.OutputLabel@102f163
+id: j_idt41
type: org.primefaces.component.inputtext.InputText@35cd5d
+id: j_idt42
type: javax.faces.component.html.HtmlPanelGrid@3dc0e2
+id: j_idt43
type: org.primefaces.component.commandbutton.CommandButton@4269de
+id: categorytree
type: org.primefaces.component.treetable.TreeTable@349f31
+id: j_idt44
type:
Categories
+id: col1 <===============
type: org.primefaces.component.column.Column@eb38b5
+id: out1
type: javax.faces.component.html.HtmlOutputLabel@d802ee
+id: col2
type: org.primefaces.component.column.Column@1a88afb
+id: com1
type: org.primefaces.component.commandlink.CommandLink@3c7600
+id: col3
type: org.primefaces.component.column.Column@1671af2
+id: com2
type: org.primefaces.component.commandlink.CommandLink@1a2769
+id: col1 <===============
type: org.primefaces.component.column.Column@bf5e96
+id: j_idt45
type:
Category Name
+id: out1
type: javax.faces.component.html.HtmlOutputLabel@2e2067
+id: col2
type: org.primefaces.component.column.Column@51703d
+id: j_idt46
type:
Edit
+id: com1
type: org.primefaces.component.commandlink.CommandLink@9fc24a
+id: col3
type: org.primefaces.component.column.Column@8cb5ba
+id: j_idt47
type:
Delete
+id: com2
type: org.primefaces.component.commandlink.CommandLink@1eef7db
+id: dialog
type: org.primefaces.component.dialog.Dialog@1d26686
+id: documentPanel
type: org.primefaces.component.outputpanel.OutputPanel@491682
+id: j_idt48
type: javax.faces.component.html.HtmlPanelGrid@64db02
+id: j_idt49
type: javax.faces.component.html.HtmlOutputLabel@1667f48
+id: basic
type: org.primefaces.component.inplace.Inplace@2e50af
+id: name
type: javax.faces.component.html.HtmlInputText@b34ab2
+id: j_idt50
type: javax.faces.component.html.HtmlPanelGrid@ed25ec
+id: j_idt51
type: org.primefaces.component.commandbutton.CommandButton@154ae8e
+id: btnclear
type: org.primefaces.component.commandbutton.CommandButton@90196c
+id: footer
type: org.primefaces.component.layout.LayoutUnit@753f4a
+id: j_idt52
type: org.primefaces.component.outputlabel.OutputLabel@18e3248
+id: j_idt53
type:
</html>
Dec 12, 2013 5:27:01 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/product/productmanage.xhtml]
java.lang.IllegalStateException: Component ID productform:categorytree:col1 has already been found in the view.
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:974)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:958)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:958)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:958)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:958)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:958)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:958)
at com.sun.faces.application.view.FaceletFullStateManagementStrategy.saveView(FaceletFullStateManagementStrategy.java:706)
at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:89)
at javax.faces.application.StateManager.getViewState(StateManager.java:593)
at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:454)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:322)
at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)
at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:425)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2430)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2419)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
最佳答案
我解决了这个错误。我不知道为什么 Jsf 需要在 bean 的构造函数中初始化所有的树节点。我用空字符串值初始化了所有树节点,然后一切正常。它适用于 Session/View Scoped bean。
更新:1由于不正确的 ajax 更新,也可能会发生此错误。我试图从每个组件发出 ajax 请求并更新整个面板(面板内的组件)。然后我将更新更改为仅更新特定 View ,例如。选择一个菜单。这里的解决方案是仅更新特定组件而不更新整个表单或 View 。
更新:2我在 web.xml 文件中将 param-value 从 false 更改为 true,然后这个问题就解决了,
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>true</param-value>
</context-param>
关于java - 在 View 中发现重复的组件 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20543070/
我想知道如何考虑需要您做出某些选择才能看到最终结果的搜索系统。我说的是 select 表单,您可以在其中根据您的选择继续操作,然后您会看到结果。 下面描述了我正在谈论的一个随机示例。想象一下 Init
您好,我目前正在编写一些软件来管理我们的库存。我搜索了 2 个表 master_stock(保存每一个股票代码和描述)库存(保存库存代码、地点、数量...) 一切都很好,但这是我遇到的问题。 假设我的
我有 2 个表,我想合并其数据。id 是我的关键字段(增量且不同)。表1和表2字段说明例如:id - 名称 - 值 我想将表2的所有数据插入表1,它们有不同的数据,但在某些行中有相同的id。 所以当我
我正在努力解决汇编中的一个问题,我必须获取十六进制代码的第一个字节 (FF) 并将其复制到整个值中: 0x045893FF input 0xFFFFFFFF output 我所做的
我有 Eclipse Indigo 版本,我可以在其中运行 Java 和 C++ 项目。 但我只想使用另一个 Eclipse 来编写 C++ 项目。所以我将 eclipse(不是工作区)的源文件夹复制
This question already has answers here: What is a NullPointerException, and how do I fix it? (12个答案)
This question already has answers here: Numbering rows within groups in a data frame (8个答案) 5个月前关闭。
我知道用q记录到寄存器中,但我想知道是否可以设置一些东西来快速调用最后一个记录,就像一样。 回顾最后一个简短的编辑命令(有关 的讨论请参阅 here。)。 我知道@@,但它似乎只有在执行@z之后才起作
来自 Eclipse 并且一直习惯于复制行,发现 Xcode 没有这样的功能是很奇怪的。或者是吗? 我知道可以更改系统范围的键绑定(bind),但这不是我想要的。 最佳答案 要删除一行:Ctrl-A
假设我有一个包含元素的列表,例如[1,2,3,4,5,6,7,8]。我想创建长度为 N 的该元素的所有排列。 因此,对于N = 4,它将是[[1,1,1,1],[1,1,1,2],[1,1,2,1],
我有一个带有 JMenu 的 JFrame。当我在某些情况下添加包含图像的 JPanel 时,程序首次启动时菜单会重复。调整大小时重复的菜单消失。任何建议都非常感激。谢谢。代码如下: public c
我正在尝试查找目录中文件的重复项。 我对这个 block 有一个问题,它以文件地址作为参数: public void findFiles(ArrayList list){ HashMap hm
我知道这个问题已经发布并且已经给出了答案,但我的情况不同,因为我在单个方法上填充多个下拉列表,所以如果我点击此链接 After every postback dropdownlist items re
我正在尝试为我的日历应用程序实现重复模式。我希望它的工作方式与 Outlook 在您设置重复约会时的工作方式相同。 public async Task> ApplyReccurrencePeriod
我有一个利用 cookie 来支持准向导的应用程序(即,它是一组相互导航的页面,它们必须以特定顺序出现以进行注册)。 加载 Logon.aspx 页面时 - 默认页面 - 浏览器 cookie 看起来
我有 3 个输入,代码检查它们是否为空,如果为空,则将变量值添加到输入中。 所以我有 3 个具有值的变量: var input1text = "something here"; var input2t
根据数组的长度更改数组的每个元素的最佳方法是什么? 例如: User #1 input = "XYZVC" Expected Output = "BLABL" User #2 input = "XYZ
我在让 Algolia 正常工作时遇到了一些麻烦。我正在使用 NodeJS 并尝试在我的数据库和 Algolia 之间进行一些同步,但由于某种原因似乎随机弹出大量重复项。 如您所见,在某些情况下,会弹
遵循以下规则: expr: '(' expr ')' #exprExpr | expr ( AND expr )+ #exprAnd | expr ( OR expr )+ #exprO
我有一个布局,我想从左边进入并停留几秒钟,然后我希望它从右边离开。为此,我编写了以下代码: 这里我在布局中设置数据: private void loadDoctor(int doctorsInTheL
我是一名优秀的程序员,十分优秀!