Java学习不走弯路教程(14 代码结构整理)

代码结构整理

一. 前言

在前上一章教程中,介绍了和浏览器的通讯。
本章将在上一章的基础上,进一步扩展程序。

注:
1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题。
2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓。

学习本章需要准备的知识:
1.读完本系列教程的前面章节。

二. 步入正题

话不多说,大家自己理解,下面步入正题:

为了在后面的课程中走的更远,我们来整理一下代码的结构。

首先我们把业务逻辑都放在app包下,并且将这个包分为三层,web,service,dao
然后我们把框架相关代码放在fw下,
把服务器代码放到server下
代码结构如下:

为了让程序变得通用,我们把请求处理和结果处理封装成Request和Response

代码如下:

 1 /**
 2  *
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class Request {
 7
 8     private Map<String,String> parameterMap = new HashMap<String,String>();
 9     private String path;
10
11     /**
12      * 如果是get行,则解析后面的参数为key-value形式
13      * @param message
14      */
15     public void addHeader(String message) {
16         String[] messageDetails = message.split(" ");
17
18         if(messageDetails[0].equalsIgnoreCase("get")) {
19             path = messageDetails[1];
20
21             int endPos = path.indexOf("?");
22             if(endPos == -1) {
23                 path = path.substring(1);
24             }else {
25                 String paramString = path.substring(endPos+1);
26                 path = path.substring(1,endPos);
27
28                 String[] params = paramString.split("&");
29                 for(int i = 0; i < params.length; i ++) {
30                     String[] keyValue = params[i].split("=");
31                     parameterMap.put(keyValue[0], keyValue[1]);
32                 }
33             }
34         }
35
36     }
37
38     public String getPath() {
39         return this.path;
40     }
41
42     public String getParameter(String key) {
43         return parameterMap.get(key);
44     }
45 }
 1 /**
 2  *
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class Response {
 7
 8     private StringBuffer data = new StringBuffer();
 9
10     public String getData() {
11         return data.toString();
12     }
13
14     public void print(String printData) {
15         data.append(printData);
16     }
17 }

相关调用部分代码修改如下:

 1 /**
 2  *
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class PersonController {
 7
 8     public void doGet(Request request, Response response) {
 9
10         String personId = request.getParameter("personid");
11         MyContainer container = MyContainer.getInstance();
12         PersonService personService = (PersonService)container.getObject(PersonService.class);
13
14         Person personResult = personService.getPerson(personId);
15
16         response.print("id:"+personResult.id);
17         response.print("<br/>username:"+personResult.username);
18         response.print("<br/>password:"+personResult.passwd);
19
20     }
21 }
 1 /**
 2  *
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class ClientThread implements Runnable{
 7
 8     private Socket socket;
 9     private BufferedReader br;
10     private PrintWriter pw;
11
12     public ClientThread(Socket socket) {
13         try {
14
15             InputStream is = socket.getInputStream();
16             InputStreamReader isr = new InputStreamReader(is);
17             br = new BufferedReader(isr);
18
19             OutputStream os = socket.getOutputStream();
20             OutputStreamWriter osw = new OutputStreamWriter(os);
21             pw = new PrintWriter(osw,true);
22
23         } catch (IOException e) {
24             e.printStackTrace();
25         }
26     }
27
28     public void run() {
29
30         // 初始化request和response
31         Request request = new Request();
32         Response response = new Response();
33
34         while(true) {
35             try {
36                 // 读取一行请求
37                 String message = br.readLine();
38                 System.out.println("get message:"+message);
39
40                 if(message == null) {
41                     break;
42                 }
43
44
45                 if(!"".equals(message)) {
46                     // 将请求作为request头,添加到request中
47                     request.addHeader(message);
48
49                 }else {
50                     // 请求发送完毕(读到空字符串)后,根据请求参数查数据
51
52                     // 获得请求路径(person)
53                     String requestPath = request.getPath();
54                     System.out.println("request path:"+requestPath);
55
56                     if(requestPath.equals("person")) {
57                         // 处理person请求
58                         PersonController personController = new PersonController();
59                         personController.doGet(request,response);
60
61                     }else if(requestPath.equals("favicon.ico")){
62                         //不处理
63                     }
64
65                     pw.println("HTTP/1.1 200 OK");
66                     pw.println("Content-Type: text/html");
67                     pw.println("Content-length: "+response.getData().length());
68                     pw.println();
69                     pw.println(response.getData());
70                     pw.println();
71                     break;
72                 }
73
74             } catch(IOException e) {
75                 e.printStackTrace();
76             } catch (Exception e) {
77                 e.printStackTrace();
78             }
79         }
80     }
81
82 }

三. 测试

启动服务器:

在浏览器端输入1,点query按钮:

显示查询结果:

完整程序请大家从[这里]下载

如有问题,大家来我的网站进行提问。
https://www.java123.vip/qa

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。

原文地址:https://www.cnblogs.com/java123-vip/p/9771051.html

时间: 2025-02-01 15:42:08

Java学习不走弯路教程(14 代码结构整理)的相关文章

Java学习不走弯路教程(3.从文件内容查询开始)

从文件查询开始 一. 前言在前两章教程中,分别介绍了DOS环境搭建和Eclipse环境搭建.本章将带大家实现用简单SQL语句查询文件.注:1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题.2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓. 二. 写给初学Java的同学在介绍本章内容之前,首先介绍一下Java的学习方法.相信大家在看本文的时候已经已经拿到了各种Java学习路径,大体都是一样.我想说的是,不要让知识的学习成为负担,Java技术种类繁多,是无论

Java学习不走弯路教程(11 单例模式2(单实例类))

单例模式2(单实例类) 一. 前言 在前上一章教程中,介绍了静态方法的伪单例模式.本章将在上一章的基础上,进一步扩展程序. 注:1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题.2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓. 学习本章需要准备的知识:1.读完本系列教程的前面章节.2.理解单例模式. 二. 步入正题话不多说,大家自己理解,下面步入正题: 静态方法虽然能满足我们的需求,但他牺牲了面向对象对程序带来的扩展性,比如AOP等.本章我们讨论对单实

Java学习不走弯路教程(1.DOS环境搭建)

DOS环境搭建在开始写第一个Java程序之前,我们需要做一些简单的准备工作. 1.1 还记得DOS吗我们可以通过图形界面来操作我们的电脑.但作为程序员,你首先需要学会用命令行的方式来操作电脑,因为不是所有的电脑都提供图形界面的.Windows环境下可以通过DOS来执行命令.你只需要记住大概5个命令,即可完成电脑的基本操作. 我们首先启动DOS环境:在文件浏览器的地址栏中输入cmd,回车,如下图所示. 光标左边显示的是当前所在目录.本教程实例均在C盘下操作,所以如果不是C盘,输入c:回车,切换到C

IOS开发-OC学习-常用功能代码片段整理

IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是在做与URL有关的功能时,需要在Info.plist中添加一段代码进而实现让网址完成从Http到Https的转换,以及其他的一些功能. 在从一个新手到逐渐学会各种功能.代码.控件.方法如何使用的过程中,也在逐渐积累一些知识,但是一次总不会把这些东西都深刻记住并完全理解.所以在这儿记录下这些东西,用来

Java开发手册 Java学习手册教程(MtJava开发手册)

本文档的版权归MtJava文档小组所有,本文档及其描述的内容受有关法律的版权保护,对本文档内容的任何形式的非法复制,泄露或散布,将导致相应的法律责任. MtJava只是一个学习Java的简化版本,适合有一些Java基础的人学习参考,主要是为了辅助MtAndroid的学习者学习的文档 Java开发手册 Java学习手册教程(MtJava开发手册),布布扣,bubuko.com

Java学习笔记四(代码块 )

1 代码块的分类:java中的代码块是指使用{}括起来的一段代码,根据位置不同可以分为四种: 普通代码块 构造快 静态代码块 同步代码块 今天主要学习前三种代码块,同步代码块在学习到多线程部分的时候再加学习. 2 普通代码块:直接定义在方法中的代码块,如下: public class CodeSpace { public static void main(String args[]){ { int x = 30; System.out.println("普通代码块x="+x); } /

Java学习 - 第五个代码模型:异常处理结构

到现在为止已经清楚了异常的基本处理形式,但是遗留的两个问题:finally无用.throw无用,那么为了更好的解释这两个操作的含义,给出一个异常处理的标准结构. 范例:现在要求定义一个div()方法(定义在MyMath类里面),这个方法开发要求如下: · 此方法之中所有出现的异常一定要交给被调用处进行处理: · 在进行除法计算开始首先要输出一行提示信息“1.除法计算开始,打开计算功能”: · 在除法计算进行完毕之后也要输出一行提示信息“2.除法计算结束,关闭计算功能”: 在所有的开发之中,首先一

java学习(四)代码的设计

一.目的 1.为了使程序员编写的代码更加的简洁,使人阅读起来更加流畅 2.将运算代码与界面代码完全分离开来,利于团队开发,提高团队之间的工作效率 3. 在很短的时间内可以替换整个站点的外观: 4.使程序员可以抽象编程,而无须接触HTML代码: 5.可以重复利用以前的模板. 二.示例 引用前一篇的记忆曲线的JSP文件 1.未进行分离的代码 1 <%@ page language="java" contentType="text/html; charset=UTF-8&qu

JAVA学习-第四个代码模型

第四个代码模型:接口应用 在现实生活之中经常会遇见如下的几种情况: · 在一片森林之中有多种树木: · 在商场之中有多种商品: · 在一个停车场里停放着多种车辆,例如:卡车.轿车.摩托车.自行车. 下面模拟以上的一个场景.现在有间超市,在超市之中提供有多种商品,现在要求实现商品的上架销售和下架的功能,同时可以根据关键字查询出商品的信息.本程序只要求描述出类的结构即可. 范例:定义商品标准 interface Goods {         // 商品 public String getName(