WEB由浅入深-01篇

67 阅读4分钟
学习.jpg

前篇

之前一直在看数据库相关的知识,现在转战Web项目了,其实之前也做过,但就是感觉那那都差一点,算了,还是重新学一遍吧!希望每天进步一点!每天一个Web小知识!

中篇

请阐述一下你对C/S架构和B/S架构的理解?

C/S:客户端服务器架构模式

优点:充分利用客户端机器的资源,减轻服务器的负荷。具体表现为:可以将一部分安全要求不高的计算任务、存储任务放在客户端执行,不需要把所有的计算存储都放在服务器端,从而能够在一定程度上减轻服务器的压力,也能减轻网络的负荷!

缺点:需要在客户端进行安装相应的程序,升级维护成本较高。

B/S:浏览器服务器架构模式

优点:客户端不需要安装,维护成本较低。

缺点:所有的计算和存储任务都是放在服务器端的,会导致服务器负荷较重!在服务器计算完成后需要把结果传给客户端,此时,客户端和服务器端会进行频繁的数据通信,从而网络负荷也比较重。

下面来谈谈Tomcat吧!

我们一直说客户端请求服务器端,那服务器到底指的是什么呢?首先笼统的说,就是指web容器及其有针对性的程序,Tomcat呢,它是属于WebContainer的一种,还有像JBoss、glassfish、weblogic等等都所属webcontainer,而Tomcat自身凭借着免费、体积小、性能优良的一众特性中脱颖而出!被大多数企业广泛的使用。

Tomcat的使用

使用Tomcat就是需要我们把完成的项目(直接暴露给tomcat的项目名称为ContextRoot)一个个丢进这个容器里,而这一过程我们称为deply,首先,先进入官网进行下载:

Tomcat的启动需要Java虚拟机,需要提前安装好JDK,并配置好环境变量JAVA_HOME,因为Tomcat这个程序也是由JAVA和C写出来的。

此后,需要在IDEA上进行Tomcat的配置,这里就不一一赘述了。(我自己都嫌我啰嗦了) (如果需要的话,后面再出一篇Tomcat的详细报道!)

小试牛刀

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>addTest</title>
</head>
<body>
    <form action="add" method="post">
        名称:<input type="text" name="fname">
        单价:<input type="text" name="price">
        数量:<input type="text" name="fcount">
        备注:<input type="text" name="remark">
        <input type="submit" value="提交">
    </form>
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author crystal
 * @create 2022-12-09 9:43
 */
public class AddServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String fname = request.getParameter("fname");
        String price = request.getParameter("price");
        String fcount = request.getParameter("fcount");
        String remark = request.getParameter("remark");
        System.out.println("fname = " + fname);
        System.out.println("price = " + price);
        System.out.println("fcount = " + fcount);
        System.out.println("remark = " + remark);
        
       
        FruitDAO fruitDAO = new FruitDAOImpl();
        fruitDAO.addFruit(new Fruit(null,fname,price,fcount,remark));
        System.out.println("添加成功!");

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>addServlet</servlet-name>
        <servlet-class>com.atguigu.test.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>addServlet</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>
</web-app>
/**
 * @author crystal
 * @create 2022-12-10 5:02
 */
public class FruitDAOImpl extends BaseDAO<Fruit> implements FruitDAO {

    @Override
    public void addFruit(Fruit fruit) {
        String sql = "insert into t_fruit values(?,?,?,?,?)";
        super.update(sql,fruit.getFid(),fruit.getFname(),fruit.getPrice(),fruit.getFcount(),fruit.getRemark());
    }
}
/**
 * @author crystal
 * @create 2022-12-10 4:36
 */
public interface FruitDAO {
//    添加
    void addFruit(Fruit fruit);
}
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * @author crystal
 * @create 2022-11-09 7:48
 */
public abstract class BaseDAO<T> {
//    获取连接
    public Connection getConnection(){
        Connection conn = null;
        try {
            InputStream in = BaseDAO.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties pros = new Properties();
            pros.load(in);
            String driverClass = pros.getProperty("driverClass");
            Class.forName(driverClass);
            String url = pros.getProperty("url");
            String user = pros.getProperty("user");
            String password = pros.getProperty("password");
            conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public void closeResource(Connection conn,PreparedStatement ps,ResultSet rs){
        try {
            if(conn != null)
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(ps != null)
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
//    更新
    public int update(String sql,Object...args) {
        int val = 0;
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            val = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource(conn,ps,null);
        }
        return val;
    }
    Class<T> clazz = null;
    public BaseDAO(){
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;
        Type[] arguments = paramType.getActualTypeArguments();
        clazz = (Class<T>) arguments[0];
    }
//    查询单条
    public T queryOne(String sql,Object ...args)  {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            rs = ps.executeQuery();
            if(rs.next()){
                T t = clazz.newInstance();
                ResultSetMetaData metaData = rs.getMetaData();
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    Object objectVal = rs.getObject(i + 1);
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t,objectVal);
                }
                return t;
            }
        }  catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource(conn,ps,rs);
        }
        return null;
    }
//  查询多条
    public List<T> queryList(String sql, Object ...args)  {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<T> list = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            rs = ps.executeQuery();
            list = new ArrayList<>();
            while(rs.next()){
                T t = clazz.newInstance();
                ResultSetMetaData metaData = rs.getMetaData();
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    Object objectVal = rs.getObject(i + 1);
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t,objectVal);
                }
                list.add(t);
            }
        }  catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource(conn,ps,rs);
        }
        return list;
    }

//    查询特殊值
    public <E> E getValue(String sql,Object ...args)  {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1,args[i]);
            }
            rs = ps.executeQuery();
            if(rs.next()){
                return (E) rs.getObject(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource(conn,ps,rs);
        }
        return null;
    }
}
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=UTF-8
user=root
password=root

总结

访问Tomcat中项目时:

  • 客户端发送请求,action="add",method="post"
  • 在web.xml文件中对应到url-pattern=/add
  • url-pattern对应servlet-name,而后找到servlet-class
  • Tomcat调用指定的ServletClass中的doPost方法,执行其中的程序

以上就是Tomcat处理客户端请求的具体流程!(想了解Tomcat更多,请看Tomcat详篇)