39、Java开发:代码实践与面试技巧

Java开发:代码实践与面试技巧

1. Java消息监听代码解析

在Java开发中,消息监听是一个常见的功能。以下是一段相关的代码:

MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(jmsListener);
connection.start();

public static void stopListening() {
    try {
        connection.stop();
    }
    catch (JMSException e) {
        throw new RuntimeException(e);
    }
}

private static Connection connection;

private static class JMSListener implements MessageListener {
    private MessageHandler messageHandler;
    private JMSListener(MessageHandler messageHandler) {
        this.messageHandler = messageHandler;
    }
    @Override
    public void onMessage(Message message) {
        TextMessage textMessage = (TextMessage) message;
        try {
            System.out.println("Got message: " + textMessage.getText());
            messageHandler.handle(textMessage.getText());
        }
        catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }
}

public interface MessageHandler {
    void handle(String message);
}

上述代码实现了一个简单的消息监听功能。首先,创建一个消息消费者 consumer ,并为其设置消息监听器 jmsListener ,然后启动连接。 stopListening 方法用于停止监听。 JMSListener 类实现了 MessageListener 接口,当接收到消息时,会将消息转换为文本消息并进行处理。

2. JavaFX客户端代码分析

JavaFX是一个用于创建富客户端应用程序的框架。以下是一个JavaFX客户端的代码示例:

class JavaFXMessageHandler extends MessageHandler {
    override public function handle(message:String):Void {
        FX.deferAction( function() { addNewText(message) } );
    }
}
Messages.startListening(new JavaFXMessageHandler());
var oldText = "";
var newText = "";
var oldTextOpacity = 0.0;
var oldTextYShift = -40.0;
var font = Font {
    name: "Verdana"
    size: 16
}
var oldTextLabel:Label = Label {
    font: font
    text: bind oldText
    textFill: Color.web("#808020")
    translateY: bind oldTextYShift
    opacity: bind oldTextOpacity
}
var newTextOpacity = 0.0;
var newTextYShift = 40.0;
var newTextLabel:Label = Label {
    textAlignment: TextAlignment.CENTER
    font: font
    textFill: Color.web("#808020")
    text: bind newText
    translateY: bind newTextYShift
    opacity: bind newTextOpacity;
}
var oldTextAnimation = Timeline {
    repeatCount: 1
    keyFrames: [
        at (0s) {
            oldTextOpacity => 1.0 tween Interpolator.LINEAR;
            oldTextYShift => 0.0 tween Interpolator.LINEAR;
        }
        at (1s) {
            oldTextOpacity => 0.0 tween Interpolator.LINEAR;
            oldTextYShift => -40.0 tween Interpolator.LINEAR;
        }
    ];
}
var newTextAnimation = Timeline {
    repeatCount: 1
    keyFrames: [
        at (0s) {
            newTextOpacity => 0.0 tween Interpolator.LINEAR;
            newTextYShift => 40.0 tween Interpolator.LINEAR;
        }
        at (.5s) {
            newTextOpacity => 1.0 tween Interpolator.LINEAR;
            newTextYShift => 0.0 tween Interpolator.LINEAR;
        }
    ];
}
function addNewText(text: String): Void {
    oldText = newText;
    newText = text;
    oldTextAnimation.playFromStart();
    newTextAnimation.playFromStart();
}
Stage {
    title: "Application title"
    scene: Scene {
        width: 600
        height: 100
        content: VBox {
            content: [
                Stack {
                    nodeHPos: HPos.CENTER
                    content: [
                        Rectangle {
                            width: 600
                            height: 80
                            opacity: 0.3
                            fill: LinearGradient {
                                startX: 0, startY: 0.0, endX: 0, endY: 80.0
                                proportional: false
                                stops: [
                                    Stop { offset: 0.0 color: 
                                                   Color.web("#303030") }
                                    Stop { offset: 1.0 color: 
                                                   Color.web("#FFFFFF") }
                                ]
                            }
                        },
                        oldTextLabel,
                        newTextLabel ]
                }]
        }
    }
    onClose : function() { Messages.stopListening(); }
}

这段代码创建了一个JavaFX客户端应用程序。 JavaFXMessageHandler 类继承自 MessageHandler ,用于处理接收到的消息。通过 addNewText 函数更新文本内容,并使用 Timeline 类实现动画效果。 Stage Scene 用于创建应用程序的窗口和场景。

3. HTML客户端与部署

为了提供另一种访问消息系统的方式,可以使用HTML客户端。以下是一个简单的HTML客户端代码:

<html>
<head>
    <title>JMS Demo</title>
</head>
<body>
    Click this link to open <a href="prices.html">
                   JavaFX client consuming price quotes</a>
    <p>Enter any text in the input field below and watch how JavaFx 
client will receive it</p>
    <form action="send" method="POST">
        <label title="Text to send">
            <input value="" name="text"/>
        </label>
    </form>
</body>
</html>

当用户在输入框中输入文本并按下回车键时,文本将被发送到服务器。服务器端的 SendMessage servlet会处理该请求:

@WebServlet("/send")
public class SendMessage extends HttpServlet {
 @EJB
 private MessageService messageService;
 protected void doPost(HttpServletRequest request, 
HttpServletResponse response) throws IOException, ServletException {
  String text = request.getParameter("text");
  messageService.sendMessage(text);
  response.sendRedirect("index.html");
 }
}

为了部署JavaFX应用程序,需要创建一个JNLP文件:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+">
    <information>
        <title>jms-send-receive</title>
        <vendor>practicaljava</vendor>
        <homepage href=""/>
        <description>jms send and receive</description>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version="1.5+"/>
        <extension name="JavaFX Runtime"
 href="http://dl.javafx.com/1.3.1/javafx-rt.jnlp"/>
        <jar href="javafx-ui.jar" main="true"/>
    </resources>
    <applet-desc name="javafx-ui" 
    main-class="com.sun.javafx.runtime.adapter.Applet" 
width="200" height="80">
        <param name="MainJavaFXScript" value="com.practicaljava.lesson37.ui.Main"/>
    </applet-desc>
    <update check="always"/>
</jnlp>

这个JNLP文件列出了需要下载到客户端的资源,包括JavaFX运行时和相关的JAR文件。

4. 项目构建与部署步骤

要构建和部署这个应用程序,可以按照以下步骤进行:
1. 安装Mercurial :从http://mercurial.selenic.com下载并安装分布式源控制管理工具Mercurial。在终端窗口中输入 hg –version ,确认安装成功。
2. 获取代码 :在终端窗口中输入以下命令,将代码示例检出到 java24hourtrainer 文件夹中:

hg clone https://practicaljava.googlecode.com/hg/ java24hourtrainier 
  1. 安装JavaFX SDK :从http://javafx.com/downloads/all.jsp?bundle=javafx_sdk下载并安装JavaFX 1.3 SDK。
  2. 检查Maven :在命令提示符下输入 mvn –v ,检查是否已安装Maven。如果未安装,从http://maven.apache.org/download.html下载并安装。
  3. 构建项目 :在终端或命令窗口中,进入 java24hourtrainer/java-ee/lesson37 目录,运行 mvn install
  4. 创建 settings.xml 文件 :在 .m2 目录下创建一个名为 settings.xml 的文本文件,内容如下:
<settings>
  <pluginGroups>
     <pluginGroup>com.practicaljava.maven.plugin</pluginGroup>
  </pluginGroups>
</settings> 
  1. 构建插件 :进入 java24hourtrainer/maven-plugins 目录,运行 mvn install
  2. 部署应用程序 :进入 /java-ee/lesson37/web-demo 目录,运行以下命令:
mvn gf:create-domain
mvn gf:start-domain
mvn gf:deploy
  1. 启动Open MQ :启动Open MQ并创建一个名为 Prices 的主题。
  2. 配置GlassFish :在浏览器中打开http://localhost:5000/,创建 TopicConnectionFactory jms/StockPrices 主题。
  3. 测试应用程序 :确保Open MQ和GlassFish服务器正在运行,在浏览器中访问http://localhost:8080/javafx-web-demo/,测试应用程序。
5. Java技术面试技巧

在Java技术面试中,有一些规则和技巧可以提高面试成功率。整个求职过程可以分为三个阶段:
| 阶段 | 要点 |
| ---- | ---- |
| 获取面试机会 | 调整简历以突出与职位相关的技能,利用网络拓展人脉。 |
| 成功面试 | 提前了解职位的技术细节,准备相关的技术话题,帮助面试官了解自己的技术能力。 |
| 考虑录用通知 | 综合考虑薪资、福利、职业发展等因素。 |

5.1 获取面试机会
  • 优化简历 :根据职位要求调整简历,突出相关技能,避免包含无关信息。
  • 利用网络 :参加Java用户组会议、关注Java开发者的Twitter账号、参加专业会议和研讨会。
5.2 成功面试
  • 了解职位细节 :从招聘人员那里获取尽可能多的技术细节,提前进行研究。
  • 准备技术话题 :准备一些有趣和具有挑战性的技术问题,主动引导面试话题。
  • 练习测试题 :对于初级开发者,可以做一些认证考试的选择题,提高应对测试的能力。

以下是一个简单的面试准备流程:

graph LR
    A[获取职位信息] --> B[研究技术细节]
    B --> C[准备技术话题]
    C --> D[练习测试题]
    D --> E[参加面试]

通过以上的代码实践和面试技巧,希望能帮助你在Java开发领域取得更好的成绩。无论是构建应用程序还是应对面试,都需要不断学习和实践。

Java开发:代码实践与面试技巧(续)

6. 代码功能深入解析
6.1 Java消息监听部分

在Java消息监听的代码中, MessageConsumer 负责从指定的 topic 接收消息。 consumer.setMessageListener(jmsListener) 这行代码将消息监听器 jmsListener 绑定到消费者上,当有新消息到达时, JMSListener 类中的 onMessage 方法会被触发。在 onMessage 方法里,将接收到的消息转换为 TextMessage 类型,然后通过 messageHandler.handle(textMessage.getText()) 将消息内容传递给消息处理器进行处理。

MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(jmsListener);
connection.start();

public static void stopListening() {
    try {
        connection.stop();
    }
    catch (JMSException e) {
        throw new RuntimeException(e);
    }
}

private static Connection connection;

private static class JMSListener implements MessageListener {
    private MessageHandler messageHandler;
    private JMSListener(MessageHandler messageHandler) {
        this.messageHandler = messageHandler;
    }
    @Override
    public void onMessage(Message message) {
        TextMessage textMessage = (TextMessage) message;
        try {
            System.out.println("Got message: " + textMessage.getText());
            messageHandler.handle(textMessage.getText());
        }
        catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }
}

public interface MessageHandler {
    void handle(String message);
}
6.2 JavaFX客户端部分

JavaFX客户端代码实现了一个动态显示消息的界面。 JavaFXMessageHandler 类继承自 MessageHandler ,重写了 handle 方法,使用 FX.deferAction 异步调用 addNewText 函数更新文本内容。

addNewText 函数会更新 oldText newText 的值,并启动 oldTextAnimation newTextAnimation 动画。 Timeline 类通过设置关键帧( keyFrames )来实现动画效果,在不同的时间点改变文本的透明度和位置。

class JavaFXMessageHandler extends MessageHandler {
    override public function handle(message:String):Void {
        FX.deferAction( function() { addNewText(message) } );
    }
}
Messages.startListening(new JavaFXMessageHandler());
var oldText = "";
var newText = "";
var oldTextOpacity = 0.0;
var oldTextYShift = -40.0;
var font = Font {
    name: "Verdana"
    size: 16
}
var oldTextLabel:Label = Label {
    font: font
    text: bind oldText
    textFill: Color.web("#808020")
    translateY: bind oldTextYShift
    opacity: bind oldTextOpacity
}
var newTextOpacity = 0.0;
var newTextYShift = 40.0;
var newTextLabel:Label = Label {
    textAlignment: TextAlignment.CENTER
    font: font
    textFill: Color.web("#808020")
    text: bind newText
    translateY: bind newTextYShift
    opacity: bind newTextOpacity;
}
var oldTextAnimation = Timeline {
    repeatCount: 1
    keyFrames: [
        at (0s) {
            oldTextOpacity => 1.0 tween Interpolator.LINEAR;
            oldTextYShift => 0.0 tween Interpolator.LINEAR;
        }
        at (1s) {
            oldTextOpacity => 0.0 tween Interpolator.LINEAR;
            oldTextYShift => -40.0 tween Interpolator.LINEAR;
        }
    ];
}
var newTextAnimation = Timeline {
    repeatCount: 1
    keyFrames: [
        at (0s) {
            newTextOpacity => 0.0 tween Interpolator.LINEAR;
            newTextYShift => 40.0 tween Interpolator.LINEAR;
        }
        at (.5s) {
            newTextOpacity => 1.0 tween Interpolator.LINEAR;
            newTextYShift => 0.0 tween Interpolator.LINEAR;
        }
    ];
}
function addNewText(text: String): Void {
    oldText = newText;
    newText = text;
    oldTextAnimation.playFromStart();
    newTextAnimation.playFromStart();
}
Stage {
    title: "Application title"
    scene: Scene {
        width: 600
        height: 100
        content: VBox {
            content: [
                Stack {
                    nodeHPos: HPos.CENTER
                    content: [
                        Rectangle {
                            width: 600
                            height: 80
                            opacity: 0.3
                            fill: LinearGradient {
                                startX: 0, startY: 0.0, endX: 0, endY: 80.0
                                proportional: false
                                stops: [
                                    Stop { offset: 0.0 color: 
                                                   Color.web("#303030") }
                                    Stop { offset: 1.0 color: 
                                                   Color.web("#FFFFFF") }
                                ]
                            }
                        },
                        oldTextLabel,
                        newTextLabel ]
                }]
        }
    }
    onClose : function() { Messages.stopListening(); }
}
6.3 HTML客户端与部署部分

HTML客户端通过一个简单的表单将用户输入的文本发送到服务器。服务器端的 SendMessage servlet接收请求,调用 messageService.sendMessage(text) 将消息发送到消息系统。

JNLP文件用于部署JavaFX应用程序,它列出了需要下载到客户端的资源,包括JavaFX运行时和相关的JAR文件。客户端通过JavaScript函数 javafx 加载JNLP文件,确保客户端计算机有正确的JRE版本。

<html>
<head>
    <title>JMS Demo</title>
</head>
<body>
    Click this link to open <a href="prices.html">
                   JavaFX client consuming price quotes</a>
    <p>Enter any text in the input field below and watch how JavaFx 
client will receive it</p>
    <form action="send" method="POST">
        <label title="Text to send">
            <input value="" name="text"/>
        </label>
    </form>
</body>
</html>
@WebServlet("/send")
public class SendMessage extends HttpServlet {
 @EJB
 private MessageService messageService;
 protected void doPost(HttpServletRequest request, 
HttpServletResponse response) throws IOException, ServletException {
  String text = request.getParameter("text");
  messageService.sendMessage(text);
  response.sendRedirect("index.html");
 }
}
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+">
    <information>
        <title>jms-send-receive</title>
        <vendor>practicaljava</vendor>
        <homepage href=""/>
        <description>jms send and receive</description>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version="1.5+"/>
        <extension name="JavaFX Runtime"
 href="http://dl.javafx.com/1.3.1/javafx-rt.jnlp"/>
        <jar href="javafx-ui.jar" main="true"/>
    </resources>
    <applet-desc name="javafx-ui" 
    main-class="com.sun.javafx.runtime.adapter.Applet" 
width="200" height="80">
        <param name="MainJavaFXScript" value="com.practicaljava.lesson37.ui.Main"/>
    </applet-desc>
    <update check="always"/>
</jnlp>
7. 项目构建与部署的注意事项

在项目构建和部署过程中,有一些需要注意的地方:
- Mercurial安装 :确保Mercurial正确安装并配置,通过 hg –version 命令验证安装情况。
- Maven配置 :Maven的环境变量需要正确设置,确保 mvn 命令可以正常使用。在创建 settings.xml 文件时,要注意文件路径和内容的正确性。
- 服务器配置 :Open MQ和GlassFish服务器的配置需要按照步骤进行,确保主题和连接工厂正确创建。
- 客户端权限 :在测试JavaFX应用程序时,可能会遇到客户端权限问题,需要允许JavaFX插件访问计算机。

8. 面试技巧的补充说明
8.1 面试中的沟通技巧

在面试过程中,良好的沟通技巧非常重要。清晰、准确地表达自己的想法,避免使用过于复杂或模糊的语言。当面试官提出问题时,要认真倾听,确保理解问题的含义后再回答。如果不确定问题,可以请求面试官进一步解释。

在介绍自己的技术经验和项目时,要有条理地进行阐述,突出重点和关键技术。可以使用一些实际的案例来支持自己的观点,让面试官更好地了解自己的能力。

8.2 应对压力面试

有些面试可能会采用压力面试的方式,面试官可能会提出一些尖锐或具有挑战性的问题。在这种情况下,要保持冷静,不要被问题的表面所吓倒。可以先思考一下问题的本质,然后有条理地回答。

如果遇到自己不会的问题,不要慌张,可以诚实地告诉面试官自己不太熟悉这个领域,但表示愿意学习和了解。同时,可以尝试从自己熟悉的相关领域进行类比和推理,展示自己的学习能力和思维方式。

以下是一个面试应对流程的细化:

graph LR
    A[获取职位信息] --> B[研究技术细节]
    B --> C[准备技术话题]
    C --> D[练习测试题]
    D --> E[参加面试]
    E --> F{遇到问题}
    F -- 简单问题 --> G[清晰回答]
    F -- 复杂问题 --> H[思考本质后回答]
    F -- 不会的问题 --> I[诚实表达并尝试类比推理]

通过深入理解代码功能和掌握面试技巧,你可以在Java开发领域更加游刃有余。无论是开发应用程序还是应对面试,都需要不断积累经验,提高自己的技术水平和综合素质。希望以上内容对你有所帮助,祝你在Java开发的道路上取得更大的成功。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值