Day2 网页制作学生信息查询系统

1.html制作学生信息查询系统

要求

        用html文件制作一个简单的学生信息查询系统,仅完成学生信息的全部显示即可

运行结果

        

代码案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Student List</title>
</head>
<!-- 
    学生信息: 学号(NO.),姓名(name),性别(sex),年龄(age)
 -->
<body>
    
    <table border="1">
        <tr>
            <th>NO.</th>
            <th>name</th>
            <th>sex</th>
            <th>age</th>
        </tr>
        <tr>
            <td>001</td>
            <td>ZhangSan</td>
            <td>M</td>
            <td>19</td>
        </tr>
        <tr>
            <td>002</td>
            <td>LiSi</td>
            <td>W</td>
            <td>10</td>
        </tr>
        <tr>
            <td>003</td>
            <td>WanWu</td>
            <td>M</td>
            <td>18</td>
        </tr>
    </table>

</body>
</html>

2.制作简易服务器查看学生信息查询系统

思路顺序

  1. 制作一个假服务器
  2. 接收浏览器访问请求,做出响应
  3. 打印html文件

打印html文件的两种方式

  • 逐行打印html文件
    • 优势:可以直接在java代码中利用数据库等工具更改数据,更适合一般情况
    • 劣势:书写内容繁琐
  • 直接读取html文件打印
    • 优势:书写内容少,书写效率高
    • 劣势:如涉及信息的增删改,如学生信息的增加修改等,无法做到直接修改
  • 总结:虽然方法二比较方便,但是方法一对于日常使用更加重要

代码示例

  • 逐行打印html文件代码示例:
import java.net.*;
import java.io.*;
public class Server {
  public static void main(String[]args) throws IOException {
      ServerSocket ss=new ServerSocket(10003);
     Socket s= ss.accept();     //接收请求
    InputStream in= s.getInputStream();
    BufferedReader br=new BufferedReader(new InputStreamReader(in));
    String str=br.readLine();
    String [] strs =str.split(" ");

    //判断请求请求资源是否为stuList.html文件,不是则直接结束
    if(!strs[1].equals("/stuList.html")) {   
    
        s.close();
        return ;
    }

    //以下为对浏览器做出响应
    OutputStream out=s.getOutputStream();
    PrintWriter pw=new PrintWriter(new OutputStreamWriter(out));
    pw.println("HTTP/1.1 200 OK");
    pw.println("Content-Type: text/html");
    pw.println("");   //响应协议固定内容,之后为我们所做的响应体内容,即stuList.html文件

    pw.println("<!DOCTYPE html>");
    pw.println("<html>");
    pw.println("<head><title>Student List</title></head>");
    pw.println("<body>");
    pw.println("<table border='1'>");
    pw.println("<tr> <th>NO.</th> <th>name</th><th>sex</th><th>age</th> </tr>");
    pw.println("<tr><td>001</td> <td>Zhanghongyu</td> <td>m</td> <td>19</td></tr>");
    pw.println("<tr><td>002</td> <td>Ruanchenxi</td> <td>m</td> <td>19</td></tr>");
    pw.println("<tr><td>003</td> <td>Zhangsan</td> <td>m</td> <td>19</td></tr>");
    pw.println("</table>");
    pw.println("</body>");
    pw.println("</html>");

    pw.flush(); 
    s.close();  //清除缓存,否则显示不完全
  }
  
}
  • 直接读取html文件 代码示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.*;
import java.net.*;

public class StuCourseApp {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(10072);
        Socket s = ss.accept();
        InputStream in = s.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String str = br.readLine();
        // 接收请求,返回响应
        String[] strs = str.split(" ");
        OutputStream out = s.getOutputStream();
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
        FileReader fr = new FileReader("C:/Users/27154/Desktop/html/" + strs[1]);
        BufferedReader bfr = new BufferedReader(fr);

        pw.println("HTTP/1.1 200 OK");
        pw.println("Content-Type: text/html");
        pw.println("");
        // 2.利用文件读取,读取html文本
        while ((str = bfr.readLine()) != null) {
            pw.println(str);
        }
       
        pw.close();
        s.close();
        // 二者对比,各有优劣,如果只涉及到数据的打印,数据不会发生变化,则2更方便,但是如果涉及到数据的变动,例如学生的更新删除等等,2无法做到直接修改,还是1好用
    }

}

3.apache-tomcat-9.0.90介绍

3.1文件说明

  • bin 二进制文件
  • conf 配置文件
  • lib 库文件
  • logs 日志文件
  • temp 临时文件
  • webapps 项目文件

4.Servlet

4.1定义

      Servlet是Server Applet的简称,是用Java编写的服务器端程序。其主要功能在于和浏览器交互并生成动态Web内容。

        后续我们将不再自己写一个假服务端来接收浏览器请求,直接使用Servlet进行。

4.2作用

  • 程序片段
  • Servlet可用来处理浏览器请求

      

4.3抽象理解Servlet工作原理

java类和方法的关系
4.3.1Servlet
  • 使用自己写的类创建对象                  例如:类名 对象名 = new 类名()
  • 使用自己创建的调用方法                  例如:对象名.方法()

        红体字为我们后续工作时写的类,黑体为apache-tomcat已经写好的存放在那的类

4.3.2思考

        既然它已经写好类和方法了,他又怎么知道我们后续创建的类和方法呢?又怎么使用我们后续新创建的类和方法呢?

4.3.3答案

        通过多态和继承解决它已经存入的上述黑体字数据,通过反射机制解决我们新创建的红体字数据。

具体原理b站链接:

动态代理-01-动态代理的思想分析_哔哩哔哩_bilibili

大致思路:

        它先封装好多个主类及对应主类方法,我们再创建新的类时,要严格按照主类要求来创建,通过继承其中一个主类,重写主类方法。再通过反射机制,使我们新创建的类和方法直接映射到已写好代码中去。

        这样我们只需要向文件添加新的类,就可以实现2中的全部代码功能,而不需要重写新程序

下是案例代码举例:我们只需要写入新的子类与修改Object.txt中内容即可,不需要修改原有代码

import java.io.*;

//main函数中代码原本全部写好,我们不需要更改,我们只更改了Object.txt的内容与创建新的子类
public class Poly {
    public static void main(String[] args) throws Exception {
        // 反射机制,使得Object.txt内的内容被提取出来
        // Object.txt只存储了"Cat"三个字符,反射为后面的 new Cat();
        FileReader fr = new FileReader("Object.txt");
        BufferedReader br = new BufferedReader(fr);
        String str = br.readLine();
        // 类名(他已经输入好的类,如这里的Animal) 对象名(他已输入好的,如animal) = new 类名() (我们将写的,如这里的cat)
        Animal animal = (Animal) Class.forName(str).newInstance();// Animal animal = new Cat();
        // 对象名.方法()
        animal.say();
    }
}

// 原本已经写好的主类Animal
interface Animal {
    public void say();
}

// 我们新创建的子类Dog
class Dog implements Animal {
    public void say() {
        System.out.println("汪汪汪");
    }
}

// 我们新创建的子类Cat
class Cat implements Animal {
    public void say() {
        System.out.println("喵喵喵");
    }
}

5.通过apache-tomcat在浏览器查看html文件

5.1方法步骤

        1. 写一个字类继承 HttpServlet ,重写方法,导包servlet-api.jar,如代码中的OutPut

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class OutPut extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub

        System.out.println("Hello,World!");
    }

}
package poly;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class StuList extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter pw = resp.getWriter();
        pw.println("<!DOCTYPE html>");
        pw.println("<head><title>Student List</title></head>");
        pw.println("<body>");
        pw.println("<table border='1'>");
        pw.println("<tr><th>NO.</th><th>name</th><th>sex</th><th>age</th></tr>");
        pw.println("<tr><td>001</td><td>ZhangSan</td><td>M</td><td>19</td></tr>");
        pw.println("<tr> <td>002</td><td>LiSi</td><td>W</td><td>10</td></tr>");
        pw.println("<tr> <td>003</td><td>WanWu</td><td>M</td><td>18</td></tr>");
        pw.println("</table>");
        pw.println("</body></html>");
    }

}

        2.将.class文件复制到classes文件夹下,注意如果该.class类在一个包中,则需要将包文件一起存放,例如下图示:poly表示一个包,包中包含两个.class文件

        3.改web.xml配置,用<servlet>和<servlet-mapping>定位,命名格式尽量与类名相同

        我们在网页输入网址http://127.0.0.1:8080/url(我们需要请求访问的资源)

        当apache-tomcat接收到网址<url-pattern> /OutPut 时,它会根据<servlet-name> OutPut 找到对应的<servlet-name> OutPut,然后访问<servlet-class>OutPut类,如下图示例:

        注意如果类在包中,需要将包的名字就需要写上 包名.类名,如下图示例:

        4.运行bin文件夹下的startup.bat文件,每次调试后都需要重新打开。

        5.在网页端输入查询地址,得到结果,例如下图

6 debug

6.1 apache-tomcat端口被占用

解决方法:

        1.Win + R运行命令cmd启动命令提示符

        2.输入netstat -ano,找到8080端口对应PID

        3.打开任务管理器,在详细信息中找到对应PID,结束该任务,重新启动即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值