Web基础和servlet基础

TomCat的目录结构

Bin:脚本目录(存放启动、关闭这些命令)
Conf:存放配置文件的目录
Lib:存放jar包
Logs: 存放日志文件
Temp: 临时文件
Webapps:  项目发布目录
Work:  jsp文件编译后生成的.java文件和.class文件存放的目录

请求行,请求头和请求体

请求行:
        请求方法  请求URL   HTTP版本
请求头:
        Host:            
        User-Agent:  
        Accept:
        Accept-Language
        Accept-Encoding:
        Referer:
        onnection: 
        Cookie:       
请求体:
        get没有请求体,即跟在URL后面,post有请求体,不展示在地址栏里                  

响应行,响应头和响应体

 1 响应行:
 2         HTTP协议  状态码
 3 响应头:
 4         Accept-Ranges: bytes
 5         Cache-Control: max-age=0
 6         Connection: keep-alive
 7         Content-Length: 114
 8         Content-Type: text/html
 9         Date: Sun, 01 Sep 2019 14:09:54 GMT
10         Etag: "5d2c473c-72"
11         Expires: Sun, 01 Sep 2019 14:09:54 GMT
12         Last-Modified: Mon, 15 Jul 2019 09:28:28 GMT
13         Server: nginx
14 请求体:
15         图片,文本,html ......       

Get请求乱码和Post请求乱码和响应乱码

get乱码
        username = new String(username.getBytes("ISO-8895-1"),"utf-8")
    
        设置xml URIEncoding"UTF-8";
Post乱码
        request.setCharacterEncoding("UTF-8");
response.setContextType("text/html;charset=utf-8");

servlet 入门和执行流程

问题:为什么在浏览器输入http://localhost:8080/day10/demo1就能够执行doGet()方法

    在服务器下寻找day10项目下的xml文件
    在xml下寻找/demo1
    根据/demo1找到<servlet-name>
    再次找相同名字的<servlet-name>
    对应一个完整的类名
    使用反射加载类名

案例: 使用servlet完成用户登录

   登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="Setvlet" method="post">
    username:<input type="text" name="username" ><br>
    password:<input type="password" name="password" ><br>
    验证码:<input type="text" name="CheckCode"><img src="CheckCodeSetvlet" id="CheckCode">
    <a id="CheckCode" >看不清,换一张</a>
    <input type="submit" value=" login ">
</form>
</body>
</html>

  调用servlet

@WebServlet(name = "Servlet",urlPatterns = "/Setvlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        UserService userService = new UserServiceImpl();
        User user1 = userService.login(user);

        response.setContentType("text/html;charset=utf-8");

        ServletContext sc = this.getServletContext();

        if(user!=null){
            int num = 0;
            if(sc.getAttribute("num")!=null){
                num = (int)sc.getAttribute("num");
            }
            sc.setAttribute("num", ++num);
            PrintWriter out = response.getWriter();
            num = (int)sc.getAttribute("num");
            out.print("<h1>第"+num+"位登录成功的用户</h1>");
        }else{
            response.sendRedirect("login.html");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

  调用service层

public class UserServiceImpl implements UserService {
    @Override
    public User login(User user) {
        UserDao userDao = new UserDaoimpl();
        User user1 = userDao.login(user);
        return user1;
    }

  调用dao层

public class UserDaoimpl implements UserDao {
    @Override
    public User login(User user) {
        QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select * from user where username = ? and password = ?";
        User user1 = null;
        try {
            user1 = qr.query(sql, new BeanHandler<>(User.class),new Object[]{user.getPassword(),user.getPassword()});
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user1;
    }
}

  bean层

public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private int age;
}

  utils层  C3P0连接池

import java.sql.Connection;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    private static DataSource ds;
    static{
        ds = new ComboPooledDataSource();
    }
    public static DataSource getDataSource(){
        return ds;
    }
    public static Connection getConnection(){
        Connection conn = null;
        try{
            conn = ds.getConnection();
        }catch(Exception e){
            e.printStackTrace();
        }
        return conn;
    }
}

  c3p0-config.xml默认配置

     <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///0826</property>
        <property name="user">root</property>
        <property name="password">123</property>

案例登录流程分析

我凝视这恒星,等待这那场风暴,我已经准备好了
原文地址:https://www.cnblogs.com/cheng5350/p/11444191.html