关于java中B/S架构

概述:

B/S 架构的全称为 Browser/Server,即浏览器/服务器结构。 Browser 指的是 Web 浏览器,极少数业务逻辑在前端实现,主要的业务逻辑在服务器端现,

Browser 客户端,WebApp 服务器端和 DB 端构成所谓的三层架构。 B/S 架构的系统无须特别安装,只有 Web 浏览器即可。B/S 架构中,显示逻辑交给了

Web浏览器,业务处理逻辑放在了 WebApp 上,这样就避免了庞大的胖客户端,减少了客户端的压力。因为客户端包含的逻辑很少,因此也被成为瘦客户端。

优点:
1) 客户端无需安装,有 Web 浏览器即可。
2BS 架构可以直接放在广域网上,通过一定的权限控制实现多客户访
问的目的,交互性较强。
3BS 架构无需升级多个客户端,升级服务器即可。
缺点:
1) 在跨浏览器上, BS 架构不尽如人意。
2) 表现要达到 CS 架构的程度需要花费不少精力。
3) 在速度和安全性上需要花费巨大的设计成本,这是 BS 架构的最大问题。

B/S架构图:

B/S 架构的系统参与者:
第一: Web 客户端 Browser
第二: Web 服务器 Server
第三: WebApp
第四:数据库服务器
B/S 架构的系统中参与者之间的接口与协议:
第一: Web 客户端 Browser 和 Web 服务器端 Server 之间是 W3C 制定的 HTTP 协议。
第二: Web 服务器和 Web 应用之间是 SUN 制定的 Servlet 接口。
第三: Web 应用中的小 java 程序和数据库服务器之间是 SUN 制定的 JDBC 接口。

B/S架构:多线程访问服务器

BootStrap:

package com.bjpowernode.core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import com.bjpowernode.util.Logger;

/**
 * 程序主入口
 * @author
 * @version  1.0
 * @since    1.0
 */
public class BootStrap {

	public static void main(String[] args) {
       //程序入口
		start();
	}

	private static void start() {
		/**
		 * 程序启动入口
		 */
		Logger.log("httpserver start");
		ServerSocket serverSocket = null;
		Socket clientSocket = null;
		BufferedReader br = null;

		try {
			//记录开启时间
			long start = System.currentTimeMillis();
			//从server.xml配置文件中获取端口号:8080
			int port = ServerParser.getPort();
			Logger.log("httpserver-port:" + port);
			//创建服务端套接字,并且绑定端口号:8080
			serverSocket = new ServerSocket(port);
			//记录结束时间
			long end = System.currentTimeMillis();
			Logger.log("httpserver started:" + (end - start) + "ms");
			while(true){
				//开始监听网络,此时程序处于等待状态,等待接收
				clientSocket = serverSocket.accept();
				new Thread(new HandlerRequest(clientSocket)).start();

			}
			//接受客户端消息
			/*br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
			//打印消息
			String temp = null;
			while((temp = br.readLine()) != null){
				System.out.println(temp);
			}*/

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{

			//关闭资源
			if(br != null){
				try {
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(clientSocket != null){
				try {
					clientSocket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			if(serverSocket != null){
				try {
					serverSocket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}
	}

}

 DateUtil:

package com.bjpowernode.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期处理类
 * @author
 * @version    1.0
 * @since      1.0
 *
 */
public class DateUtil {

	private DateUtil(){

	}

	/**
	 * 获取系统当前时间
	 * @return Strinng [yyyy-MM-dd HH:mm:ss SSS]
	 */
	public static String getNowTime(){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
		Date nowTime = new Date();
		return dateFormat.format(nowTime);
	}
}

 Logger:

package com.bjpowernode.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 记录日志
 * @author
 * @version    1.0
 * @since      1.0
 */
public class Logger {
       //工具类的方法往往都是静态的,直接通过类名调用即可,不需要创建对象
	   //工具类的构造方法往往是私有的,但不是必须的
	private Logger(){

	}
	/**
	 * 记录普通日志
	 * @param info
	 */
	public static void log(String info){
		/*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
		//获取系统当前时间
		Date nowTime = new Date();
		String strTime = dateFormat.format(nowTime);*/
		System.out.println("[INFO]" + DateUtil.getNowTime() + "" + info);

	}

}

LoggerTest:

package com.bjpowernode.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 记录日志
 * @author
 * @version    1.0
 * @since      1.0
 */
public class Logger {
       //工具类的方法往往都是静态的,直接通过类名调用即可,不需要创建对象
	   //工具类的构造方法往往是私有的,但不是必须的
	private Logger(){

	}
	/**
	 * 记录普通日志
	 * @param info
	 */
	public static void log(String info){
		/*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
		//获取系统当前时间
		Date nowTime = new Date();
		String strTime = dateFormat.format(nowTime);*/
		System.out.println("[INFO]" + DateUtil.getNowTime() + "" + info);

	}

}
package com.bjpowernode.core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import com.bjpowernode.util.Logger;

public class HandlerRequest implements Runnable {

	private Socket clientSocket;

	public HandlerRequest(Socket clientSocket) {
		this.clientSocket = clientSocket;
	}

	@Override
	public void run() {
		// 负责处理客户端发送的请求
		BufferedReader br = null;
		Logger.log("httpserver 线程Thread-Name:" + Thread.currentThread().getName());
		try {
			// 接受消息
			br = new BufferedReader(new InputStreamReader(
					clientSocket.getInputStream()));
			// 打印消息
			String temp = null;
			while ((temp = br.readLine()) != null) {
				System.out.println(temp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			//关闭资源
			if(br != null){
				try {
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(clientSocket != null){
				try {
					clientSocket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

}
package com.bjpowernode.core;

import java.io.File;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.DocumentException;

import org.dom4j.io.SAXReader;

/**
 * 解析server.xml配置文件
 * @author
 * @version  1.0
 * @since    1.0
 */
public class ServerParser {
	public static int getPort(){
		//默认值
		int port = 8080;
		try{
		//创建解析器
		SAXReader saxReader = new SAXReader();
		//通过解析器的read方法将配置的文件读取到内存中去
		Document document = saxReader.read(new File("conf/server.xml"));
		//获取connector节点元素对象的xpath路径:/server/service/connector
		//获取connector节点元素对象的xpath路径:server//connector
		//获取connector节点元素对象的xpath路径://connector
		Element connectorElt = (Element) document.selectSingleNode("//connector");
		//获取port属性对象的值
		port = Integer.parseInt(connectorElt.attributeValue("port"));
	} catch(Exception e){
		e.printStackTrace();
	}
		return port;

	}
}

server.xml:

<?xml version="1.0" encoding="UTF-8"?>
<server>
	<service>
		<connector port="8080"></connector>
	</service>
</server>

 所建工程:

 运行结果:

时间: 2024-07-30 13:50:37

关于java中B/S架构的相关文章

Java中微服务架构与传统架构的区别

Java中微服务架构与传统架构的区别 在聊微服务之前,先来看看传统架构的优缺点. 传统的 MVC 架构,所有的子系统都集成在一个很繁杂的 JVM 进程中. 优点: 这种单体架构的优点在于方便管理,所有代码在同一项目中,但是当需求越来越多,项目规模越来越大,其坏处也很明显. 缺点: 1.项目过于臃肿,部署效率低下 当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者难以维护.单体应用的代码越来越多,依赖的资源越来越多时,应用编译打包.部署测试一次非常耗时.系统高可用性差,资

[Java Web]2\Web开发中的一些架构

1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸如事务.安全等操作问题,所以现在开发往往要通过中间件进行过渡,即,程序运行在中间件上,并通过中间件进行操作系统的操作,而具体一些相关的处理,如事务.安全等完全由中间件来负责,这样程序员只要完成具体的功能开发即可. 2.Java EE架构: Java EE 是在 Java SE 的基础上构建的,.NE

单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》

package com.doctor.java.design_pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**  * 单例模式的几种实现--<java开发技术-在架构中体验设计模式和算法之美>  *   * @author doctor  *  * @time 2015年4月24日 下午11:11:03  */ public class SingletonPattern { /**  * @param a

架构中的设计原则之接口分离原则(ISP) - 《java开发技术-在架构中体验设计模式和算法之美》

接口分离原则 接口分离原则的核心思想是:不应该强迫客户程序依赖它们不需要使用的方法.英文缩写ISP,即Interface Segregation Principle.其实接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该 把所有的操作都封装到一个接口中. 这里的"接口"指的不仅仅是通过interface关键字定义的接口,接口分为如下两种. 对象接口.java中声明的一个类,通过new关键字产生的一个实例,它是对一个类型的事物的描述,这也是一种

关于java中的本地缓存-总结概述

java中的本地缓存,工作后陆续用到,一直想写,一直无从下手,最近又涉及到这方面的问题了,梳理了一下.自己构造单例.guava.ehcache基本上涵盖了目前的大多数行为了.   为什么要有本地缓存? 在 系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减 少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略. 为什么是本地缓存,而

java集合之Collection架构

Java集合之Collection架构 首先,我们对Collection进行说明.下面先看看Collection的一些框架类的关系图: Collection是一个接口,它主要的两个分支是:List 和 Set.List和Set都是接口,它们继承于Collection.List是有序的队列,List中可以有重复的元素:而Set是数学概念中的集合,Set中没有重复元素!List和Set都有它们各自的实现类. 如ArrayList  LinkedList  Vector  Stack 为了方便,我们抽

深入分析 Java 中的中文编码问题 (文章来自网络)

许令波,developerWorks 中国网站最佳作者,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,喜欢钻研开源框架的设计原理.有时间将学到的知识整理成文章,也喜欢记录下工作和生活中的一些思考.个人网站是:http://xulingbo.net. 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言.由于人类的语言有太多,因而表示这些语言

Java中的比较

Java SE.Java EE.Java ME区别 是什么: Java SE=Java Standard Edition=J2SE= Java标准版 Java EE=Java Enterprise Edition=J2EE= Java企业版 Java ME=Java Mobile Edition=J2ME = Java移动版 特点: SE主要用于桌面程序(Swing),控制台开发(main程序). EE企业级开发(JSP,Struts,Spring,Hibernate,EJB,iBATIS等),

Java中的日志——Java.util.logging、log4j、commons-logging

Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging.其中log4j和commons-logging都是apache软件基金会的开源项目.这三种方式的区别如下: Java.util.logging,JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包. log4j,最强大的记录日志的方式.可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等.