while(或Java的任何其他循环)的主体可以是空的.这是因为null语句(仅由分号组成的语句)在Java中在语法上是有效的.现在考虑一下:
i = 100
j = 200
while(++i < --j); // no body in this loop
system.out.println(i);
system.out.println(j);
Run Code Online (Sandbox Code Playgroud)
我注意到,如果i的值小于j,则循环重复自身,当条件未能满足时,则只有下面的2个语句被提供.我是正确的还是这背后还有其他逻辑吗?
我正在阅读JavaScript:The Complete Reference,Third Edition:Thomas Powell; Fritz Schneider对这些概念有了详细的了解.
范围规则
在函数或对象之外,无论是否使用var明确定义,变量都在全局空间内.在函数或对象中,如果使用var语句,则定义的变量将是构造的本地变量; 没有声明,它将是全球性的.
通常,JavaScript开发人员对使用var的范围规则进行假设并不完全正确.例如,在for循环中找到的var语句不会将该值范围限定为循环.在这种情况下,如果它位于函数或对象之外,则它的范围是它所在的函数或全局空间.
只是为了看看会发生什么,我这样编码,

当我在Eclipse IDE中按Ctrl+ Space来显示JavaScript提议时,为什么我能够访问函数外的变量jLocal?
根据作者描述:
例如,在for循环中找到的var语句不会将该值范围限定为循环.在这种情况下,如果它位于函数或对象之外,则它的范围是它所在的函数或全局空间.
我正在运行Mojarra 2.2.0。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
托管bean操作方法是-
public void action() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
System.out.println(session.getId()); // not null for stateful views
}
Run Code Online (Sandbox Code Playgroud)
对于stateless视图session.getId()抛出NPE
对于非无状态视图-触发GET请求,有 JSESSIONID=340041C96D5AA446D761C3602F54A76D
我读了它在这里觉得─
对于客户端状态保存机制,JSF不会创建会话,并且会在必要时将视图状态存储在表单形式为javax.faces.ViewState的隐藏输入字段中。
此外,这里提到
JSF确实会自动创建会话,因为必须将JSF视图状态存储在该位置。如果将JSF状态保存方法设置为客户端而不是服务器,则它将不会存储在会话中,因此无需创建会话
我认为以上内容为我带来麻烦。
如果将JSF状态保存方法设置为客户端而不是服务器,那么它将不会存储在会话中//完全同意
和
因此无需创建会话。//这很混乱,因为对于客户端保存机制,会话ID由Servlet容器生成,因此存在与请求相关联的会话。
参考与BalusC在这个问题上的讨论,我创建了一个HttpSessionListener-
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
Thread.dumpStack();
}
public void sessionDestroyed(HttpSessionEvent event) {
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅以下附件的屏幕截图(这2个屏幕截图适用于2.0.3版,必须存在一个旧的bug才能创建会话)-
在这里,它被作者提及。
如果[COMPONENT]标记为有效,则两者都返回相同的值,即提交,转换和验证的值。
考虑一个非常简单的代码段:
<h:form>
<h:inputText value="#{bean.inputValue}"
binding="#{bean.htmlInputText}"
validator="nameValidator" /><br/>
<h:commandButton value="Submit" action="#{bean.action}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
与@RequestScoped支持豆-
public Integer inputValue = 5;
public HtmlInputText htmlInputText;
public void action(){
System.out.println(" getSubmittedValue() "+htmlInputText.getSubmittedValue());
System.out.println(" isLocalValueSet() "+ htmlInputText.isLocalValueSet());
System.out.println(" getValue() " + htmlInputText.getValue());
System.out.println(" getLocalValue() " +htmlInputText.getLocalValue());
}
Run Code Online (Sandbox Code Playgroud)
按下提交按钮后,输出为-
getSubmittedValue() null AS EXPECTED, since Conversion & Validation succeded
isLocalValueSet() false
getValue() 25 AS EXPECTED, since Conversion & Validation succeded
getLocalValue() null Why NULL? IN WHAT CONTEXT HAS THE AUTHOR SAID SO
Run Code Online (Sandbox Code Playgroud) Herbert Schildt在" 完整的参考文献 " - 第5章:
switch语句通常比一组嵌套ifs更有效.
当编译器编译switch语句时,它会检查每个case常量并创建一个"Jump Table",它将用于根据表达式的值选择执行路径.因此,如果需要在一大组值中进行选择,则switch语句的运行速度将比使用if-elses序列编码的等效逻辑快得多.编译器可以这样做,因为它知道case常量都是相同的类型,并且必须与switch表达式进行相等性比较.编译器没有if表达式的长列表.
" JUMP TABLE " 这个词是什么意思?
Switch与if-statements的不同之处在于,switch只能测试相等性,而if可以评估任何类型的boolean表达式.如果a switch(expression)与任何case常量都不匹配,那意味着它进入了defaultcase.这不是一个不平等的情况吗?这让我想到具有之间没有这么大的差异switch和if.
从同一本书的摘录中,他写道:
if-then-else语句可以基于值或条件的范围来测试表达式,而switch语句仅基于单个整数,枚举值或String对象来测试表达式.
这if不是比那更强大switch吗?
我曾在Core Java的不同项目中工作,但从未觉得需要使用该switch语句,也没有看到其他同事使用它.甚至没有一次.为什么一个更强大的switch控制声明无法if在可用性方面落地?
这是一个创建新线程并开始运行的示例:
class NewThread implements Runnable {
Thread t;
NewThread() {
// Create a new, second thread
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
t.start(); // Start the thread
}
// This is the entry point for the second thread.
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
Run Code Online (Sandbox Code Playgroud)
现在考虑另一个线程(main),在创建新线程之后,在调用其在Thread中声明的start()方法之前,它不会开始运行.实质上,start()执行对run()的调用.
public …Run Code Online (Sandbox Code Playgroud) 我看到大多数anycode总是通过其接口类型(例如,Set)而不是其实现类型来引用Collection.
以下是Oracle Java教程提供的原因,
这是一个强烈推荐的编程实践,因为它使您可以灵活地仅通过更改构造函数来更改实现.如果用于存储集合的变量或用于传递它的参数被声明为Collection的实现类型而不是其接口类型,则必须更改所有此类变量和参数以更改其实现类型.
此外,作者还提供了无法保证生成的程序能够正常运行的信息.如果程序使用原始实现类型中存在但未在新实现类型中存在的任何非标准操作,则程序将失败.仅通过其界面引用集合可防止您使用任何非标准操作.
作者谈到的非标准操作是什么?
其次,如何仅通过其界面引用集合会阻止我们使用任何非标准操作?
请在Java代码的帮助下详细说明?
我需要FacesMessage为这个组件显示一个,如下所示,

问题是它在 UI 上多次显示,如下所示,

其次,输入的日期40.06.2015是无效的,因此FacesMessage, 但它被转换为10.07.2015. 我不知道如何防止这种情况。任何帮助都受到高度赞赏。我知道它可以setLenient()在DateFormat课堂上轻松处理,但不知何故,在我可以在后台使用之前,UI 组件将其转换为下个月的日期。
附加到该组件的验证器如下:

那么,如何避免多次显示“请以正确格式输入日期”?
我想到了使用h:message而不是h:messages, 并在验证器方法的 catch 块中像这样
FacesContext.getCurrentInstance().addMessage("formId:aboveCompId", message);
Run Code Online (Sandbox Code Playgroud)
但 UI 上没有显示任何内容。有什么建议?
我需要展示一个vertical scrollbar总是在textarea我放的东西
overflow-y:scroll;
Run Code Online (Sandbox Code Playgroud)
然后可以将其显示为如下所示,

虽然滚动元素确实反映了,但我很惊讶在哪里需要如下所示的栏.我想这样,如下图所示,

只需要那个黑条吧.有什么建议.
如果我在课堂上做这样的事情-
private AtomicLong count = new AtomicLong(0);
Run Code Online (Sandbox Code Playgroud)
然后在一个方法中,我这样做-
count = new AtomicLong(1); // will this update is going to be visible to other threads
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为AtomicLong是@ThreadSafe
考虑员工类 -
public class Employer implements Serializable{
private Long id;
private String name;
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj instanceof Employer) {
Employer employer = (Employer) obj;
if (this.id == employer.id) {
return true;
}
}
return false;
}
//Idea from effective Java : Item 9
@Override
public int hashCode() {
int result = 17;
result = 31 * result + id.hashCode();
//result = 31 * result + name.hashCode();
return result;
} …Run Code Online (Sandbox Code Playgroud) java ×6
jsf-2 ×2
collections ×1
concurrency ×1
css ×1
hashset ×1
httpsession ×1
javascript ×1
jsf ×1
lifecycle ×1
mojarra ×1
validation ×1
while-loop ×1