Applet小程式嵌入瀏覽器中顯示
阿新 • • 發佈:2019-01-01
這篇文章寫了如何自己頂一個類,該類實現了簡單的計算器功能,然後通過瀏覽器訪問。
1、定義一個web專案,編寫一個類,該類主要實現計算器的佈局及功能的實現。
然後打包該類。package com; import java.awt.*; import java.awt.event.*; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * JApplet 繼承了Applet * @author lww * */ public class cal extends JApplet implements ActionListener { Label lblTwoNum = new Label ("請輸入兩個數字"); Label lblAdd = new Label ("此處顯示答案"); TextField txtFirstNum = new TextField (2); TextField txtSecNum = new TextField (2); Button btnAdd = new Button ( "求和"); TextField tf = new TextField(); String s = "", s1; double d1, d2; private JFrame frame; public void init() { //從頁面上獲取引數 int num1 = Integer.parseInt(getParameter("value1")); int num2 = Integer.parseInt(getParameter("value2")); txtFirstNum.setText(""+num1); txtSecNum.setText(""+num2); frame = new JFrame(); frame.setTitle("點選按鈕改變顏色"); frame.getContentPane().add(new ButtonPanel()); frame.setSize(400, 300); Button PopButton = new Button("請點選"); PopButton.addActionListener(this); Panel o = new Panel(new BorderLayout()); add(o); Panel addPanel = new Panel(); addPanel.add (lblTwoNum); addPanel.add (txtFirstNum); addPanel.add (txtSecNum); addPanel.add (btnAdd); addPanel.add (lblAdd); o.add(addPanel,"North"); o.add(PopButton,BorderLayout.WEST); Panel cal = new Panel(new BorderLayout()); cal.add(tf, "North"); o.add(cal,"Center"); Panel pn3 = new Panel(new BorderLayout()); cal.add(pn3, "Center"); Panel pn2 = new Panel();// 功能鍵介面(清除鍵和關閉鍵) pn2.setLayout(new BorderLayout()); Panel pn1 = new Panel();// 運算介面 pn1.setLayout(new GridLayout(4, 4)); pn3.add(pn2, "North"); pn3.add(pn1); // 設定按鈕 JButton b = new JButton("CLEAR"); b.setToolTipText("請按清除鍵!");// 設定清零鍵 b.setForeground(Color.RED);// 設定字型顏色 b.setBackground(Color.YELLOW);// 設定背景色 b.addActionListener(this); pn2.add(b, "Center"); b = new JButton("OFF"); b.setToolTipText("請按退出鍵!");// 設定off鍵,點選退出應用程式b.addActionListener(this); b.setForeground(Color.RED);// 字型顏色 b.setBackground(Color.ORANGE);// 背景色 pn2.add(b, "East"); b = new JButton("1");// add butten 1 b.addActionListener(this); pn1.add(b); b = new JButton("2");// add butten 2 b.addActionListener(this); pn1.add(b); b = new JButton("3");// add butten 3 b.addActionListener(this); pn1.add(b); b = new JButton("+");// add butten + b.setForeground(Color.BLUE);// 設定字型顏色 b.addActionListener(this); pn1.add(b); b = new JButton("4");// add butten 4 b.addActionListener(this); pn1.add(b); b = new JButton("5");// add butten 5 b.addActionListener(this); pn1.add(b); b = new JButton("6");// add button 6 b.addActionListener(this); pn1.add(b); b = new JButton("-");// add button - b.setForeground(Color.BLUE);// 設定字型顏色 b.addActionListener(this); pn1.add(b); b = new JButton("7");// add button 7 b.addActionListener(this); pn1.add(b); b = new JButton("8");// add button 8 b.addActionListener(this); pn1.add(b); b = new JButton("9");// add button 9 b.addActionListener(this); pn1.add(b); b = new JButton("*");// add button * b.setForeground(Color.BLUE);// 設定字型顏色 b.addActionListener(this); pn1.add(b); b = new JButton("0");// add button 0 b.addActionListener(this); pn1.add(b); b = new JButton(".");// add button . b.addActionListener(this); pn1.add(b); b = new JButton("=");// add button = b.setForeground(Color.RED);// 設定字型顏色 b.addActionListener(this); pn1.add(b); b = new JButton("\\");// add button \ b.setForeground(Color.BLUE);// 設定字型顏色 b.addActionListener(this); pn1.add(b); this.resize(400,300); btnAdd.addActionListener (this); } public void actionPerformed (ActionEvent e) { if(e.getActionCommand().equals("請點選")) { if (frame.isVisible()) frame.setVisible(false); else frame.show(); } else if(e.getActionCommand().equals("求和")){ try{ if(txtFirstNum.getText().length()!=0 &&txtSecNum.getText().length()!=0){ String firstNum = txtFirstNum.getText(); String secNum = txtSecNum.getText(); int add = Integer.parseInt(firstNum) + Integer.parseInt(secNum); lblAdd.setText ("兩數之和:"+ add); } } catch (Exception ex) { // TODO: handle exception } }else { String command = e.getActionCommand(); tf.setText(tf.getText() + command); if (command.equals("CLEAR")) // 清零鍵 按下時返回初始狀態 { s1 = null; s = ""; tf.setText("");// 記錄輸入值的變數清空 } else if (command.equals("OFF")) System.exit(0);// off鍵 關閉應用程式 else if (!command.equals("*") && !command.equals("\\") && !command.equals("+") && !command.equals("-") && !command.equals("="))// 判斷輸入是否為數字 { if (s1 == null)// 判斷輸入是否為第一個 s1 = command; else s1 += command; d1 = new Double(s1).doubleValue();// 字串型轉換為雙精度型,還原輸入數字 try { if (s.equals("+")) d1 = d1 + d2;// 加法運算 else if (s.equals("-")) d1 = d2 - d1;// 減法運算 else if (s.equals("*")) d1 = d1 * d2;// 乘法運算 else if (s.equals("\\")) d1 = d2 / d1;// 除法運算 } catch (Exception ex) { tf.setText("Error");// 錯誤顯示"Error" System.out.println(ex.getMessage()); } } else if (!command.equals("=")) // 判斷輸入是否為+ - { s = command; s1 = null; d2 = d1; } else// 輸入=時,顯示運算結果 { tf.setText(tf.getText() + d1); } } } public void paint(Graphics g) { } } class ButtonPanel extends JPanel { private class ColorAction implements ActionListener { private Color backgroundColor; public void actionPerformed(ActionEvent actionevent) { setBackground(backgroundColor); repaint(); } public ColorAction(Color color) { backgroundColor = color; } } public ButtonPanel() { JButton jbutton = new JButton("橙色"); JButton jbutton1 = new JButton("藍色"); JButton jbutton2 = new JButton("紅色"); add(jbutton); add(jbutton1); add(jbutton2); ColorAction coloraction = new ColorAction(Color.orange); ColorAction coloraction1 = new ColorAction(Color.blue); ColorAction coloraction2 = new ColorAction(Color.red); jbutton.addActionListener(coloraction); jbutton1.addActionListener(coloraction1); jbutton2.addActionListener(coloraction2); } }
執行---cmd 進入到該專案所在的WebRoot\WEB-INF\classes下
命令:jar -cvf Cal.jar *.* (打包該目錄下的內容,jar包檔名稱為Cal.jar)
建立一個keyStore 檔案
keytool -genkey -alias examples(金鑰名,任意取名) -keypass 12345678(金鑰密碼,任意取名) -storepass (金鑰密碼對,與上一密碼密碼一致) -keystore .mykeystore(生成金鑰檔名,任意取名)
在class目錄下會有Cal.jar 和 .mykeystore檔案
然後用該檔案對Cal.jar 進行簽名
金鑰庫的口令短語是:123456
examples的金鑰口令是:12345678
簽名後可以檢視Cal.jar 包META-INF中是否生成EXAMPLES.SF EXAMPLES.DSA兩個檔案
然後將該jar包拷貝放到專案的WebRoot中
然後定義index.jsp
專案目錄結構<%@ page language="java" import="java.util.*" contentType="text/html; charset=GBK" pageEncoding="GBK"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>demo</title> </head> <body> <APPLET CODE="com.cal.class" <!--呼叫的類--> id="cal" codebase="." ARCHIVE = "Cal.jar"<!--使用的jar包名稱--> WIDTH="800" HEIGHT="800"> <PARAM NAME="value1" VALUE="12"><!--頁面傳遞的引數--> <PARAM NAME="value2" VALUE="23"> </APPLET> </body> </html>
因為applet的執行是沙箱機制,在呼叫本地程式時需要做安全性設定。在本地執行該applet的jre\lib\security\java.policy檔案裡最後加permission
java.security.AllPermission;這裡需要注意的是如果客戶端裝有多個jre的話,需要找一下哪個jre是真正執行applet的
若不想修改這樣,可以再呼叫的java類中對程式碼提升許可權,例如:
private String runCmd(){
String result = AccessController.doPrivileged(new PrivilegedAction<String>() { //提升許可權
@Override
public String run() {
String res = null;
// 程式碼的具體實現
//TODO like 'Runtime.getRuntime().exec(cmd)' etc.....
return res;
}
});
return result;
}
部署流程,然後通過瀏覽器訪問 localhost:8080/ee