Java小程序之服务器的UI实现


Java小程序之服务器的UI实现
一、前言:
前面我们做的服务器都是没有界面的,只是利用简单的输入输出语句在控制台中打印语句;今天,我们要让服务器有界面,可视化操作;

二、UI功能需求:
三、 知识点分析

JTable使用:TableModelJScrollPaneVector

JTable:可以理解为表示数据的展示组件

TableModel:用于封装数据组件

Vector: 队列

代码框架

四、具体实现思路
1、先实现整个界面UI(功能暂时不着急)这里主要是JTable的使用,刚开始启动按钮和关闭按钮都不能操作
2、最上方功能按钮的实现,当界面初始化的时候,用一个线程开始不断检测输入框中是否有内容,有内容则启动按钮可操作;启动按钮启动后,创建服务器对象,等待客户端的连接,并将启动按钮再次设置为不可操作,而关闭按钮设置为可操作;
3、获取客户端输入的账户和密码,服务器校验成功后,将该账号的相关信息进行封装,将封装好的信息加到Table中显示
4、显示聊天功能,消息内容昨天实在控制台中打印的,这次,我们这要将从客户端接收到的消息放在服务器界面UI中显示即可;

五、源代码:
源代码结构图:
com.huaxin.server包:
MyServer类:(什么时候启动服务器?当点击启动按钮时,执行者下面的代码)
package com.huaxin.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import com.huaxin.UI.InfoPanel;
import com.huaxin.UI.TablePanel;

public class MyServer {
	
	public static ArrayList<ServerThread> serverList = new ArrayList<ServerThread>();
	public int port;
	public ServerSocket server;
	private TablePanel tablePanel;
	private InfoPanel infoPanel;
	public MyServer(int port, TablePanel tablePanel, InfoPanel infoPanel) {
		this.port=port;
		this.tablePanel=tablePanel;
		this.infoPanel=infoPanel;
	}
	
	//启动服务器
	public void startServer(){
		try {
			//创建服务器对象
			server = new ServerSocket(port);
			System.out.println("服务器已经启动......");
			
			while(true){
				//服务器连接客户端,阻塞方法
				Socket socket=server.accept();
				System.out.println("有客户端连进来了......");
				
				ServerThread st = new ServerThread(socket,tablePanel,infoPanel);
				st.start();
				serverList.add(st);
				
				
			}
		} 
		catch (BindException e) {
			JOptionPane.showMessageDialog(null, "端口号已经占用!请重新启动服务器并输入新的端口号!");
			System.exit(0);
		}
		catch (SocketException e) {
			JOptionPane.showMessageDialog(null, "服务器已关闭.....");
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void sendMsgToClient(String s) {

		for (int i = 0; i <serverList.size(); i++) {
			//群发系统消息
			ServerThread st = MyServer.serverList.get(i);
			//获取每个客户端的输出流
			OutputStream ous;
			try {
				ous = st.socket.getOutputStream();
				st.sendMsg(ous,"The System send a msg :"+s);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  } 
		infoPanel.jta.append("System Msg :"+s+"\r\n");
	}
}

ServerThread类:
package com.huaxin.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

import com.huaxin.UI.InfoPanel;
import com.huaxin.UI.TablePanel;

import javafx.scene.control.TabPane;

public class ServerThread extends Thread {

	public Socket socket;
	public InputStream ins;
	public OutputStream os;
	public String str;
	public String name;
	public String pwd;
	private TablePanel tablePanel;
	private InfoPanel infoPanel;
	
	public ServerThread(Socket socket, TablePanel tablePanel, InfoPanel infoPanel) {
		this.socket = socket;
		this.tablePanel=tablePanel;
		this.infoPanel=infoPanel;
	}

	public void run() {
		
		Vector<String> vs=null;
		
		try {

			// 获取输入输出流
			ins = socket.getInputStream();
			os = socket.getOutputStream();

			 str = "welcome to zhou's Server";
			// 向客户端输出信息
			sendMsg(os, str);
			os.flush();
			
			/************客户端登录以及验证****************/
			
			//获取客户端输入的账户和密码
			getMsg();
			//账号和密码校验
			boolean falg =loginCheck();
			//校验不通过时,循环校验
			while(!falg){
				str="Fail to connect server......";
				sendMsg(os, str);
				os.flush();
				
				str="please check your name and password and login again.....";
				sendMsg(os, str);
				os.flush();
				getMsg();
				falg =loginCheck();
			}
			
			//校验成功后:开始聊天
				str="successful connected..... you can chat with your friends now ......";
//				str="yes";
				sendMsg(os, str);
				os.flush();
				//登录成功后,将用户名,ip地址以及登录时间加到TabelPanel中的Table中
				//先获取到TabelPanel中的Table对象,一层一层传递过来
				
				String ip =socket.getRemoteSocketAddress().toString();
				Date date = new Date();
				SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String currentTime =sdf.format(date);
				
				//封装用户名,ip地址以及时间
				vs = new Vector<String>();
				vs.add(name);
				vs.add(ip);
				vs.add(currentTime);
				
				//将封装好的vs加入到tablePanel面板的table中,并刷新面板
				tablePanel.data.add(vs);
				tablePanel.table.updateUI();
				
				// 接受客户端的信息
				String s = readMsg(ins);
				
				
				while (!s.equals("bye")) {
					
					//在消息框中显示发送的信息
					infoPanel.jta.append(name+" say:"+s+"\r\n");
					
					for (int i = 0; i < MyServer.serverList.size(); i++) {
						
						//群发消息
						ServerThread st = MyServer.serverList.get(i);
						//不给自己发消息
						if (st == this) continue;
						
						OutputStream ous =st.socket.getOutputStream();
						sendMsg(ous,name+" say:"+s);
						os.flush();
					    } 
					  //循环读取信息 
					s = readMsg(ins);
				}
			
			// server.close();
		} catch (Exception e) {
//			e.printStackTrace();
			System.out.println("客户端不正常退出......");
		}

		//关闭客户端后,将该用户的记录从向量队里中移除,并刷新面板
		if(vs!=null){
			this.tablePanel.data.remove(vs);
			this.tablePanel.table.updateUI();
		}
		// 关闭流、服务器、套接字
		try {
			ins.close();
			os.close();
			socket.close();
			
			MyServer.serverList.remove(this);
		} catch (IOException e) {
//			System.out.println("这个地方有错误......");
			e.printStackTrace();
		}
	}

	//发送消息的函数
	public void sendMsg(OutputStream os, String s) throws IOException {

		// 向客户端输出信息
		//
		byte[] bytes = s.getBytes();
		os.write(bytes);
		os.write(13);
		os.write(10);
		os.flush();

	}

	//读取客户端输入数据的函数
	public String readMsg(InputStream ins) throws Exception {
		// 读取客户端的信息
		int value = ins.read();
		// 读取整行 读取到回车(13)换行(10)时停止读
		String str = "";
		while (value != 10) {
			//点击关闭客户端时会返回-1值
			if(value ==-1){
				throw new Exception();
			}
			str = str + ((char) value);
			value = ins.read();
		}
		str = str.trim();
		return str;
	}
	
	//获取客户端账号和密码的函数
	public void getMsg() throws Exception {
		str="please enter your name :";
		sendMsg(os, str);
		os.flush();
		name =readMsg(ins);
		
		str="please enter your password :";
		sendMsg(os, str);
		os.flush();
		pwd =readMsg(ins);

	}
	
	//校验客户端输入的账号和密码的函数
	public boolean loginCheck() throws Exception{
		if(name.equals("zhou") && pwd.equals("zhou") 
				|| name.equals("user") && pwd.equals("pwd") 
				|| name.equals("huaxinjiaoyu") && pwd.equals("huaxinjiaoyu")){
			
			return true;
	   }
		return false;
 }
}

com.huaxin.UI包:
(该包分为将整个面板的三个区域分出了三个类,在UIFrame中创建该三个类,并整合三个类,达到上图的整体效果)

StartPanel类:(最上面的面板类)
package com.huaxin.UI;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.huaxin.server.MyServer;
import com.huaxin.server.ServerThread;

public class StartPanel extends JPanel{
	
	public JTextField jtf;
	public JButton startBtn;
	public JButton stoptBtn;
	public boolean flag=true;
	public MyServer ms ;
	public TablePanel tablePanel;
	public InfoPanel infoPanel;
	
	/*
	 * 最上面的面板类
	 */
	public StartPanel(TablePanel tablePanel, InfoPanel infoPanel) {
		
		this.tablePanel=tablePanel;
		this.infoPanel=infoPanel;
	
		//创建相关组件
		JLabel label =new JLabel("端口号");
		jtf = new JTextField(10);
		startBtn = new JButton("启动服务");
		//设置按钮不可操作
		startBtn.setEnabled(false);
		stoptBtn = new JButton("关闭服务");
		stoptBtn.setEnabled(false);
		//设置背景颜色
		this.setBackground(Color.green);
		//设置面板大小
		this.setPreferredSize(new Dimension(0,50));
		this.setLayout(new FlowLayout());
		//组件添加
		this.add(label);
		this.add(jtf);
		this.add(startBtn);
		this.add(stoptBtn);
		//给两个按钮添加监听器
		startBtn.addActionListener(al);
		stoptBtn.addActionListener(al);
		
		//检测输入框是否为空
		checkText();
	}
	
	//按钮监听器的具体实现
	ActionListener al = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			String command =e.getActionCommand();
			if(command.equals("启动服务")){
				//启动服务的相关逻辑操作
				flag=false;
				int port =Integer.parseInt(jtf.getText());
				ms = new MyServer(port,tablePanel,infoPanel);
				infoPanel.ms=ms;
				stoptBtn.setEnabled(true);
				startBtn.setEnabled(false);
				//用线程处理,避免阻塞
				new Thread(){
					public void run() {
						ms.startServer();
					};
				}.start();
				
			}else if(command.equals("关闭服务")){
				try {
//					flag=true;
					//关闭服务逻辑实现
					//移除所有的客户端
					while(ms.serverList.size()!=0) {
						ms.serverList.get(0).socket.close();
						ms.serverList.remove(0);
					}
					//服务器关闭
					ms.server.close();
					//设置按钮可操作属性
					stoptBtn.setEnabled(false);
					startBtn.setEnabled(true);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				
			}
		}
	};
	
	//线程检测文本输入框是否有输入
	public void checkText(){
		new Thread(){
			public void run() {
				while(flag){
					//获取文本输入框的信息
					String info=jtf.getText();
					//信息不为空或者"",则可以启动服务器
					if(!(info==null || info.equals(""))){
						startBtn.setEnabled(true);
					}
					
					try {
						this.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
		}.start();
	}
	

}


TablePanel类:登录用户信息显示面板
package com.huaxin.UI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Vector;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TablePanel extends JPanel {
	
	public JTable table;
	public Vector<Vector<String>> data;
	
	public TablePanel() {
		//设置面板属性
		this.setPreferredSize(new Dimension(450,0));
		this.setBackground(Color.white);
		this.setLayout(new BorderLayout());
		
		//创建表格
		Vector<String> colNames = new Vector<String>();
		colNames.add("用户名");
		colNames.add("IP地址");
		colNames.add("登录时间");
		data =new Vector<Vector<String>>();
		Vector<String> vs=new Vector<String>();
		
		//创建表格模型
		DefaultTableModel tm =new DefaultTableModel(data, colNames);
		table = new JTable(tm);
		//创建滚动条
		JScrollPane jsp =new JScrollPane(table);
		this.add(jsp);
	}
	
	

}


InfoPanel类:聊天信息显示面板
package com.huaxin.UI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import com.huaxin.server.MyServer;

public class InfoPanel extends JPanel{
	
	
	public MyServer ms ;
	public JTextArea jta;
	public JTextField jtf;
	
	
	public InfoPanel() {
		//设置信息面板的属性
		this.setPreferredSize(new Dimension(350,0));
		this.setBackground(Color.blue);
		this.setLayout(new BorderLayout());
		//文本输入域
		jta = new JTextArea();
		//设置自动换行
		jta.setLineWrap(true);
		JScrollPane jsp = new JScrollPane(jta);
		this.add(jsp);
		//面板底部的发送面板
		jtf = new JTextField(25);
		JButton btn = new JButton("发送");
		//发送按钮添加监听器
		btn.addActionListener(al);
		JPanel panel=new JPanel();
		panel.setLayout(new FlowLayout());
		this.add(panel,BorderLayout.SOUTH);
		panel.add(jtf);
		panel.add(btn);
		
	}
	
	//监听具体实现
	ActionListener al = new ActionListener() {
		
		public void actionPerformed(ActionEvent e) {
			//获取内容
			String s=jtf.getText();
			//为空的提示信息
			if( s==null || "".equals(s)){
				JOptionPane.showMessageDialog(null, "输入框不能为空!");
			}
			else if(ms.server.isClosed()){
				JOptionPane.showMessageDialog(null, "服务器已经关闭,不能发送消息!");
			}else{
				try {
					//不为空,则将消息发送给服务器,服务器转发给消息给每个客户端
					ms.sendMsgToClient(s);
					//清空文本
					jtf.setText("");
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		}
	};
}



UIFrame类:程序入口以及面板整合类:
package com.huaxin.UI;
import java.awt.BorderLayout;
import javax.swing.JFrame;

/*
 * 服务器后台界面类
 */
public class UIFrame extends JFrame {
	
	public TablePanel tablePanel;
	public InfoPanel infoPanel ;

	public static void main(String[] args) {
		UIFrame ui = new UIFrame();
		ui.initFrame();
	}

	public void initFrame() {
		// 设置窗体的相关属性
		this.setSize(800, 600);
		this.setTitle("服务器后台界面");
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		this.setLayout(new BorderLayout());
		tablePanel = new TablePanel();
		infoPanel = new InfoPanel();
		StartPanel startPanel = new StartPanel(tablePanel,infoPanel);
		
		//在主页面中添加三个面板
		this.add(startPanel,BorderLayout.NORTH);
		this.add(tablePanel, BorderLayout.CENTER);
		this.add(infoPanel, BorderLayout.EAST);
		this.setVisible(true);
	}	

}



六、运行结果:

先启动界面UI类,输入9090点击启动服务,开启服务器,服务器一定要先打开,否则客户端无法连接





利用系统自带的telnet客户端,启动客户端





输入正确的密码进行登录:





当有用户登录进来后的界面显示效果:




以同样的方法开启另外客户端



界面UI小时效果:




在三个客户端分别输入聊天消息:




界面UI显示效果:



测试系统发送功能:(在信息面板中的发送按钮添加监听)








七、总结:
1、不要着急,一步一步实现
2、服务那边的代码可以参看昨天的博客;
3、把界面的单个部分分成三个类出去实现,最后在一个类中创建三个类的对象,并将三个对象在该类中整合
4、一定按照思路来,越急躁的人越回一通乱来
个人经验分享:以前我也尝试照着书中的代码一句一句去敲,先把一个类的代码敲完,再去敲另一个了类的代码,其实这样是非常不好的,我们写代码的时候也不是一口气就把一个类的代码全部写完,同时,定义的变量也不是一下就能想到要那么多的变量,只是在我们需要的时候去定义某个变量;所以,写程序,思路真的非常非常重要;我把源代码都贴上来,也不是让某些人直接copy拿去交作业(当然,有部分人肯定是直接copy的),更重要的是帮助那些自学的朋友在某个地方卡壳的时候,参看一下的代码,能顺时顿悟;而浪费太多不必要的时间;最最重要的是能和大家一起学习讨论和交流;嗯,相信我的意思大家都明白!
共勉!
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和管理工具、编程技术、安全机制等四个方面全面介绍java服务器的升友技术。通过阅读本书,读者不仅能够知道用java服务器体系结构开发servlet与用传统cgi编写程序的好处,而且还能够掌握编写java servlet的各种技术和技巧。    本书适用于所有对java和web感兴趣的读者使用和参考。 第1部分 java服务器基础[/font] [/font] 第1章 java计算的体系结构[/font] [/font] 1.1 传统的计算模式[/font] 1.1.1 集中式计算模式[/font] 1.1.2 胖客户机/服务器计算模式[/font] 1.1.3 瘦客户机/服务器计算模式[/font] 1.1.4 java desktop与x终端[/font] 1.2 java计算[/font] 1.3 小结[/font] [/font] 第2章 java服务器与servlet[/font] [/font] 2.1 java server的结构[/font] 2.1.1 服务[/font] 2.1.2 服务器[/font] 2.1.3 服务构架[/font] 2.1.4 服务器处理构架[/font] 2.1.5 http服务[/font] .2.1.6 核心servlet[/font] 2 1.7 acl[/font] 2.2 servlet及其功能[/font] 2.2.1 什么是servlet[/font] 2.2.2 servlet与applet的区别[/font] 2.2.3 servlet的应用[/font] 2.3 servlet与cgi的比较[/font] 2.3.1 cgi[/font] 2.3.2 servlet的优点[/font] 2.4 运行servlet[/font] 2.5 小结[/font] [/font] 第2部分 java服务器的开发工具和管理工具[/font] [/font] 第3章 使用java server与servlet开发工具[/font] [/font] 3.1 java web server的安装与启动[/font] 3.1.1 在windows 95或windows nt上安装[/font] 3.1.2 在unix上安装[/font] 3.1.3 java server环境变量的设置[/font] 3.1.4 启动java server[/font] 3.1.5 在端口80上启动java server[/font] 3.1.6 结束java serve的运行[/font] 3.1.7 删除java server[/font] 3.1.8 显示缺省主页[/font] 3.1.9 使用随机文档[/font] 3.2 servlet的加载和调用[/font] 3.2.1 加载servlet[/font] 3.2.2 servlet的标识[/font] 3.2.3 调用servlet[/font] 3.3 jsdk的安装与使用[/font] 3.3.1 servletrunner[/font] 3.3.2 在netscape服务器上安装jsdk[/font] 3.3.3 在apache服务器上安装[/font] 3.4 小结[/font] [/font] 第4章 java web server的管理[/font] [/font] 4.1 进入管理工具[/font] 4.2 设置[/font] 4.2.1 设置web service[/font] 4.2.2 设置proxy service[/font] 4.2.3 设置管理服务[/font] 4.3 监视[/font] 4.3.1 记录输出[/font] 4.3.2 记录统计[/font] 4.3.3 资源的使用[/font] 4.4 安全控制[/font] 4.4.1 用户管理[/font] 4.4.2 用户组[/font] 4.4.3 访问控制表[/font] 4.4.4 资源保护[/font] 4.5 servlet管理[/font] 4.5.1 增加servlet[/font] 4.5.2 设置servlet属性[/font] 4.5.3 修改servlet属性[/font] 4.5.4 删除servlet[/font] 4.6 小结[/font] [/font] 第3部分 java服务器编程[/font] [/font] 第5章 servlet包介绍[/font] [/font] 5.1 javax.servlet包[/font] 5.1.1 接口servlet[/font] 5.1.2 接口servletconfig[/font] 5.1.3 接口servletcontext[/font] 5.1.4 接口servletrequest[/font] 5.1.5 接口servletresponse[/font] 5.1.6 类genericservlet[/font] 5.1.7 类servletinputstream[/font] 5.1.8 类servletoutputstream[/font] 5.2 javax.servlet.http包[/font] 5.2.1 接口httpservletrequest[/font] 5.2.2 接口httpservletresponse[/font] 5.2.3 类httpservlet[/font] 5.2.4 类httputils[/font] 5.3 sun.servlet包介绍[/font] 5.3.1 接口servletconnection[/font] 5.3.2 类servletloader[/font] 5.4 小结[/font] [/font] 第6章 sun.servlet.http包介绍[/font] [/font] 6.1 类cookie[/font] 6.2 类httpdate[/font] 6.3 类httpinputstream[/font] 6.4 类httpoutputstream[/font] 6.5 类httprequest[/font] 6.6 类httpresponse[/font] 6.7 类httpserver[/font] 6.8 类httpserverhandler[/font] 6.9 类httpservletconfig[/font] 6.10 类messagebytes[/font] 6.11 类messagestring[/font] 6.12 类mimeheaderfield[/font] 6.13 类mimeheaders[/font] 6.14 小结[/font] [/font] 第7章 genericservlet编程[/font] [/font] 7.1 servlet编程的一个小例子[/font] 7.1.1 genericservlet在jsdk中的地位[/font] 7.1.2 从hello world学习genericservlet编程[/font] 7.1.3 servlet的两个生命周期函数[/font] 7.2 servlet中的对象[/font] 7.2.1 servlet中的请求和应答对象[/font] 7.2.2 selvlet中的servletconfig对象[/font] 7.3 servlet输出html文件[/font] 7.4 小结[/font] [/font] 第8章 httpservlet编程介绍[/font] [/font] 8.1 http简介[/font] 8.1.1 http协议基本概念及其特点[/font] 8.1.2 http协议的请求和应答[/font] 8.1.3 http协议的信息处理方法[/font] 8.2 httpservlet编程入门[/font] 8.2.1 一个简单例子[/font] 8.2.2 httpservlet的常用对象介绍[/font] 8.3 cookie编程介绍[/font] 8.3.1 cookie简介[/font] 8.3.2 一个cookie例子程序[/font] 8.4 小结[/font] [/font] 第9章 servlet高级编程[/font] [/font] 9.1 servlet与form[/font] 9.1.1 form简介[/font] 9.1.2 一个完整的form[/font] 9.2 编写一个shtml文本[/font] 9.3 异常处理[/font] 9.4 servlet与applet的通信[/font] 9.5 小结[/font] [/font] 第10章 聊天室[/font] [/font] 10.1 “聊天室”客户程序[/font] 10.2 “聊天室”服务器程序[/font] 10.3 “聊天”[/font] 10.4 小结[/font] [/font] 第11章 rmi与servlet[/font] [/font] 11.1 rmi概述[/font] 11.2 如何编写rmi[/font] 11.2.1 定义一个远程接口[/font] 11.2.2 实现远程接口[/font] 11.2.3 写一个applet[/font] 11.2.4 写html文本[/font] 11.2.5 编译和执行[/font] 11.3 rmi与servlet[/font] 11.3.1 定义远程接口[/font] 11.3.2 实现远程接口[/font] 11.3.3 调用rmi的servlet[/font] 11.3.4 调用servlet的applet[/font] 11.3.5 三个超文本文件[/font] 11.3.6 编译和执行[/font] 11.4 小结[/font] [/font] 第12章 servlet与jdbc[/font] [/font] 12.1 jdbc简介[/font] 12.1.1 实现jdbc[/font] 12.1.2 jdbc类细节[/font] 12.2 jdbc与servlet结合[/font] 12.2.1 基本过程[/font] 12.2.2 servlet的同步[/font] 12.2.3 应用举例[/font] 12.3 小结[/font] [/font] 第13章 开发服务[/font] [/font] 13.1 服务[/font] 13.2 实现服务的核心[/font] 13.3 安装服务[/font] 13.3.1 创建属性文件[/font] 13.3.2 创建jamfile[/font] 13.4 创建日志[/font] 13.4.1 日志文件类型[/font] 13.4.2 在自己的服务中加入日志文件[/font] 13.5 服务的参数管理[/font] 13.5.1 系统参数[/font] 13.5.2 增加新的参数[/font] 13.5.3 创建存放参数的域[/font] 13.5.4 实现访问方法[/font] 13.5.5 构造器[/font] 13.5.6 update方法[/font] 13.6 使用realm来创建安全服务[/font] 13.6.1 查找realm[/font] 13.6.2 设置realm[/font] 13.6.3 收集用户数据的对象[/font] 13.6.4 给服务增加身份验证代码[/font] 13.7 小结[/font] [/font] 第14章 pagecompile[/font] [/font] 14.1 生成动态主页[/font] 14.1.1 创建第一个主页[/font] 14.1.2 从html文档到java源文件[/font] 14.2 语法[/font] 14.2.1 声明变量[/font] 14.2.2 条件语句[/font] 14.2.3 循环语句[/font] 14.2.4 注释[/font] 14.2.5 使用backquotes[/font] 14.2.6 使用servlet标记[/font] 14.2.7 输出java表达式[/font] 14.3 使用java类[/font] 14.3.1 重用java类[/font] 14.3.2 创建自己的类[/font] 14.3.3 访问request和response对象[/font] 14.4 servlet初始化参数[/font] 14.5 pagecompile中使用的标记[/font] 14.6 小结[/font] [/font] 第4部分 java服务器安全机制[/font] [/font] 第15章 java web server的安全机制[/font] [/font] 15.1 安全综述[/font] 15.1.1 常见的攻击形式[/font] 15.1.2 java web server的安全机制[/font] 15.1.3 其他特点[/font] 15.1.4 unix上的独有特点[/font] 15.2 web realm机制[/font] 15.2.1 realm模型[/font] 15.2.2 用户和授权[/font] 15.2.3 用户组[/font] 15.3 访问控制表(acl)[/font] 15 3.1 访问控制表结构[/font] 15.3.2 计算权限的规则[/font] 15.3.3 例子[/font] 15.3.4 用法举例[/font] 15.4 ssl机制[/font] 15.4.1 什么是ssl[/font] 15.4.2 建立安全的web服务[/font] 15.4.3 使用认证许可[/font] 15.5 沙盒[/font] 15.6 小结[/font]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值