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所有,禁止任何形式的转载与引用。

猜你喜欢

转载自www.cnblogs.com/java123-vip/p/9771051.html