前篇
之前一直在看数据库相关的知识,现在转战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详篇)