码迷,mamicode.com
首页 > 其他好文 > 详细

22.Server Project

时间:2019-07-06 19:08:43      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:equals   长度   divide   drop   工具   tomcat服务   项目部署   回顾   文件中   

 

1.预备知识_Socket 知识回顾
2.预备知识_HTML 简单入门
3.预备知识_HTTP 协议入门
4.Tomcat 服务器的快速使用

1.预备知识_Socket 知识回顾
1.1 编写服务器用到的知识点
1) Socket编程 2) HTML 3) HTTP协议 4) 反射 5) XML解析6) 服务器编写 1.2 复习 Socket 编程 (1) C/S结构:客户端与服务器端一次双向通信
技术图片
client
技术图片
server
(2) B/S结构:浏览器与服务器
技术图片
server
技术图片
browser
Attention:只要在一个形参的“类型”与“参数名”之间加上三个连续的“.”(即“...”,英文里的句中省略号),就可以让它和不确定个实参相匹配。而一个带有这样的形参的方法,就是一个实参个数可变的方法。


2.预备知识_HTML 简单入门
2.1HTML HTML: HyperText Markup Language 超文本标记语言,用于描述网页文档的一种标记语言
2.2 第一个 HTML 文档
<html> <head> <title>第一个 HTML</title> </head> <body> <h1>hello world</h1> </body> </html>
2.3 表单form
(1) form作用:与用户之间进行交互
(2)action作用:请求的服务器路径(你的数据提交到哪里去?)
(3)method作用:请求方式 get/post get 数据量小,安全性低,默认方式 post 数据量大,安全性高action:请求的服务器路径
 
技术图片
id : (用户的的浏览器在文档里区分唯一性)前端区分唯一 性,js 中
name:名称,后端(服务器)区分唯一性,获取值,只要提交数据 给后台(服务器)必须存在 name
 
 


3.预备知识_HTTP 协议入门
3.1 协议
  • (1) 应用层:HTTP、FTP、TELNET、SNMP、DNS
  • (2) 传输层:TCP、UDP
  • (3) 网络层:IP
3.2HTTP 协议简介 (1)HTTP:Hypertext Transfer Protocol 超文本传输协议,是网络应用层的协议,建立在 TCP/IP 协议基础上,HTTP 使用可 靠的 TCP 连接,默认端口为 80。 (2)用户打开 Web 浏览器(常见的 HTTP 客户端),输入 URL地址,就能接收到远程 HTTP 服务器端发送过来的网页,即HTTP 遵循请求(Request)/应答(Response)模型。
(3)Web 浏览器 向 Web 服务器发送请求,Web 服务器处理请求并返回适当 的应答,所有 HTTP 连接都被构造成一套请求与应答。
技术图片
(4)HTTP 客户端和服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写,如用.NET 编写的客户程序 与用Java编写的服务器程序顺利通信,就必须遵守HTTP协议,这样才能彼此都懂对方发送的消息,HTTP 协议严格规 定了 HTTP 请求和 HTTP 响应的数据格式。
3.3HTTP 请求格式 (1) 请求方式、URI(统一资源定位符)、HTTP 协议/版本
(2) 请求头 Request Header 请求头包含许多有关客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。 (3) 请求正文 Requet Content (只有在 post 方式才有)请求头和请求正文之间必须有符号行(回车符或行结束符), 请求正文与请求头分开。这个行非常重要,它表示请求头已结束,接 下来的是请求正文。通常 post 方式的数据存放于此,请求正文中可以包含客户提交的查询字符串等信息。在实际应用中,HTTP 请求正文可以包含更多的内容
技术图片
 
3.4HTTP 响应格式
(1) HTTP协议版本、状态代码、描述
(2) 响应头(Response Head) (3) 响应正文(Respose Content)
技术图片


4.Tomcat 服务器的快速使用
4.1Tomcat 简介 Tomcat 是在 SUN 公司的 JSWDK(JavaServer WebDevelopmentKit ,是 SUN 公司推出的小型 Servlet/JSP 调试工 具)的基础上发展起来的一个优秀的 Servlet 容器,Tomcat本身完全用 Java 语言编写。 4.2Tomcat 使用
(1) 配置 Tomcat a) JAVA_HOME Java JDK 的根目录
技术图片
 
b) CATALINA_HOME Tomcat根目录
技术图片
(2) 启动和关闭 Tomcat 启动 Tomcat 服务器:startup.bat
关闭 Tomcat 服务器:shutdown.bat
(3) 部署项目到服务器 在 webapps 目录下新建目录存放.html 面页 访问页面
4.3Tomcat目录简介
技术图片
bin目录:存放了Tomcat执行的脚本目录,存放运行tomcat服务器相关的命令。 conf目录:存放tomcat服务器相关的配置文件 例如:在tomcat服务器启动的时候,会绑定一些端口号,这些端口号就可以在配置文件server.xml文件中进行修改。 lib目录:存放tomcat服务器自带的jar包,我们也可以把其他的一些jar 包也存放到这里在tomcat中同时可以部署多个项目,这个多个项目可共享lib目录中 的jar包。 logs目录:存放tomcat服务器在运行过程中,所产生的日志文件。 temp目录:存放tomcat服务器在运行过程中,所产生的临时文件。 webapps目录:存放部署到tomcat服务器中的web项目,把项目部署服务器里面, 其实就是放到这个目录下。 work目录:这个目录和是jsp页面相关的。


5.Tomcat 服务器运行原理
5.1Tomcat 的运行原理
客户浏览器发出要求访问特定的 Servlet 的请求。
  • (1) Tomcat服务器接收到客户请求并解析。
  • (2) Tomcat服务器创建一个 ServletRequest对象,在ServletRequest 对象中包含了客户请求信息及其他关于客 户的信息,如请求头,请求正文,以及客户机的 IP 地址 等。
  • (3) Tomcat服务器创建一个ServletResponse对象
  • (4) Tomcat服务器调用客户所请求的Servlet的service服务方 法,并且把 ServletRequst 对象和 ServletResponse 对象做为参数传给该服务方法。
  • (5) Servlet从ServletRequest对象中可获取客户的请求信息。
  • (6) Servlet利用ServletResponse对象来生成响应结果。
  • (7) Tomcat服务器把Servlet生成的响应结果发送给客户。
Tomcat服务器是servlet的一个容器。
技术图片


6.预备_http 工具查看网络交互过程
6.1 下载并安装 6.2HttpWatch 的使用
1) IE浏览器-》查看-》浏览器栏-》HttpWatch Professional
技术图片


7.手写服务器
当我们知道了Tomcat服务器及其运行原理后,我们尝试着自己手写一个服务器。
7.1 搭建项目框架
  • Request:请求
  • Response:响应
  • Server:用于服务器的启动和关闭。
  • WebApp:
  • IOUtils:用于关闭所有流。
  • Servlet:是所有的servlet(用于请求),的父类。
  • web.xml:配置文件。
7.2 编写 XML 文档
技术图片
7.3 编写 IOCloseUtil 类
技术图片


8.DOM4J 解析 XML 配置文件
8.1Entity 实体类的编写 8.2Mapping 实体类的编写
8.3 解析 XML 文件
public class WebDom4j {//用于解析XML private List<Entity> entityList;//用于存储是N多Entity,而每一个Entity都是servlet-name与servlet-class private List<Mapping> mappingList;//用于存储N多Mapping,而每一个Mapping都是一个servlet-name与N多个url-pattern public List<Entity> getEntityList() { return entityList; } public void setEntityList(List<Entity> entityList) { this.entityList = entityList; } public List<Mapping> getMappingList() { return mappingList; } public void setMappingList(List<Mapping> mappingList) { this.mappingList = mappingList; } //构造方法 public WebDom4j() { entityList=new ArrayList<Entity>(); mappingList=new ArrayList<Mapping>(); } //获取Document对象的方法 private Document getDocument(){ try { //(1)创建SAXReader对象 SAXReader reader=new SAXReader(); //(2)调用read方法 return reader.read(new File("src/WEB_INFO/web.xml")); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //------------------------------------------------------------------- public void parse(Document doc){ //(1)获取根元素 Element root=doc.getRootElement(); //web-app //(2)获取servlet子元素 for(Iterator<Element> ite=root.elementIterator("servlet");ite.hasNext();){ Element subElement=ite.next();//得到每一个servlet //创建一个实体类 Entity ent=new Entity(); //用于存储servlet-name与servlet-class for(Iterator<Element> subIte=subElement.elementIterator();subIte.hasNext();){ Element ele=subIte.next(); //可能是servlet-name,也可能是servlet-class if("servlet-name".equals(ele.getName())){ ent.setName(ele.getText()); //给实体类中的name赋值 }else if("serlvet-class".equals(ele.getName())){ ent.setClazz(ele.getText()); } } //将Entity添加到集合中 entityList.add(ent); } //测试 /**for (Entity entity : entityList) { System.out.println(entity.getName()+"\t"+entity.getClazz()); }*/ //解析servlet-mapping for(Iterator<Element> ite=root.elementIterator("servlet-mapping");ite.hasNext();){ Element subEle=ite.next();//得到每一个servlet-mapping //创建一个Mapping类的对象 Mapping map=new Mapping(); //解析servlet-mapping下的子元素 for(Iterator<Element> subIte=subEle.elementIterator();subIte.hasNext();){ Element ele=subIte.next();//servlet-name,也有可能是url-patternif("serlvet-name".equals(ele.getName())){ map.setName(ele.getText());}elseif("url-pattern".equals(ele.getName())){//获取集合对象,调用集合对象的添加方法,添加元素素 map.getUrlPattern().add(ele.getText());}}//Mapping添加到集合中 mappingList.add(map);}//测试for(Mapping m : mappingList){ System.out.println(m.getName());for(String s:m.getUrlPattern()){ System.out.println(s);}}}//------------------------------------------------------------//用于测试publicstaticvoidmain(String[] args){ WebDom4j web=newWebDom4j(); web.parse(web.getDocument());}}

9.反射创建 Servlet 对象
9.1 编写 ServletContext 类 Servlet 上下文,就是一个容器,用于存储entity与mapping的映射关系。
9.2 编写 WebApp 类
WebAppClass的作用有两个,分别是: (1) 初始化程序运行的数据。 (2) 根据不同的 url 创建所请求的 Servlet 对象。
技术图片
public class WebApp {//App的意思是应用程序 private static ServletContext contxt; static{ contxt=new ServletContext(); //分别获取对应关系的Map集合 Map<String,String> servlet=contxt.getServlet(); Map<String,String> mapping=contxt.getMapping(); //创建解析XML文件对象 WebDom4j web=new WebDom4j(); web.parse(web.getDocument());//解析xml //获取解析XML之后的List集合 List<Entity> entityList=web.getEntityList(); List<Mapping> mappingList=web.getMappingList(); //将List集合中的数据存储到Map集合 for (Entity entity : entityList) { servlet.put(entity.getName(), entity.getClazz()); } // System.out.println(servlet); for( Mapping map:mappingList){ //遍历url-pattern的集合 List<String> urlPattern=map.getUrlPattern(); for(String s:urlPattern){ mapping.put(s, map.getName()); } } //System.out.println(mapping); } /** * 根据url创建不同的Servlet对象 * @param url * @return */ public static Servlet getServlet(String url){ if (url==null||url.trim().equals("")) { return null; } //调用无参构造方法创建Servlet对象 try { //如果url正确 //根据url的key获取servlet-name的值 /log=login, /reg=register String servletName=contxt.getMapping().get(url); //根据servletName得到对应的servlet-class String servletClass=contxt.getServlet().get(servletName); //得到的是一个完整个的包名+类的字符串 //使用反射创建 Servlet对象 Class<?> clazz=Class.forName(servletClass); Servlet servlet = (Servlet) clazz.newInstance(); return servlet; } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //测试 public static void main(String[] args) { System.out.println(getServlet("/log")); System.out.println(getServlet("/login")); } }


10.封装 Request_method_url 10.1 编写 Server1) 启动服务 2) 关闭服务 10.2 编写 HTML 10.3 封装 Request_method_url


11.封装 Request_存储参数_处理中文
  1. 11.1 编写分解参数的方法
  2. 11.2 编写根据页面上的 name 获取多个值的方法
  3. 11.3 编写根据页面上的 name 获取单个值的方法
  4. 11.4 编写解码的方法
  5. 11.5 测试
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%8C%97%E 4%BA%AC%E5%B0%9A%E5%AD%A6%E5%A0%82&rsv_pq=f65f15f40003a658&rsv_t=d74 7OilFeeFkf73QkinDYpKiB4y%2Ffj3mxWfE865IJ0VxoTk5Obwtc4z41pM&rqlang=cn&rsv_ente r=1&rsv_sug3=19&rsv_sug1=21&rsv_sug7=101


12.封装 Response 12.1 封装 Response1) 构造响应头 2) 推送到客户端 12.2 编写相应的 Servlet 构造响应内容12.3 启动服务器进行测试


13.封装分发器_实现多线程


14.整合最终版14.1 查缺补漏完善项目


15.1 项目总结涉及知识点1) 集合 2) IO 3) 多线程4) 网络编程5) 面向对象6) 反射 7) XML 8) HTML 15.总结和期望 15.2 项目思路 1) 先分析 2) 搭建项目框架 3) 一步一步实现,先从会的开始实现 4) 整体思路,宏观使用面向对象,微观使用面向过程5) 注重代码的调试 15.3 思想是从键盘中敲出来的1) 多注重实战
 
  1. 2) 学知识不是目的,目的是对知识的综合运用,才能将知识 转化为能力
  2. 3) 不要气馁,每天进步一点点,人最大的敌人是自己,今天 的自己比昨天的自己有进步,就是成功。
  3. 4) 今天所有的付出,都会在明天以 RMB 的形式还给你。
  4. 5) 加油!!!
 
 
 

22.Server Project

标签:equals   长度   divide   drop   工具   tomcat服务   项目部署   回顾   文件中   

原文地址:https://www.cnblogs.com/EricShen/p/11143523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!