首页 > 其他 > 详细

servlet核心技术2

时间:2021-01-19 19:56:16      阅读:30      评论:0      收藏:0      [点我收藏+]

一、Servet 与 JDBC

  • Servlet中可以使用JDBC技术访问数据库,查询DB数据,然后生成显示页面,接收请求参数,然后对DB操作
  • 为了方便重用和便于维护等目的,经常会采用DAOData Access Object)模式对数据库操作进行独立封装。技术分享图片

     

 

package com.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Dbutils {
    private   static  String dbNAME;
    private   static  String dbURL;
    private   static  String dbUSERNAME;
    private   static  String dbPASSWORD;
    static {
        dbNAME="com.mysql.jdbc.Driver";
        dbURL="jdbc:mysql://127.0.0.1:3306/db_web?characterEncoding=utf-8";
        dbUSERNAME="root";
        dbPASSWORD="123456";
        try {
            Class.forName(dbNAME);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        Connection con= DriverManager.getConnection(dbURL,dbUSERNAME,dbPASSWORD);
        return con;
    }

    public static void close(Connection con) throws SQLException {
        if (con!=null){
            con.close();
        }
    }

    public static void close(Connection con, PreparedStatement ps) throws SQLException {
        if (null!=ps){
            ps.close();
        }
        close(con);

    }
}
package com.dao;

import com.modal.User;
import com.utils.Dbutils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserDao {
    public int creatUser(User user){
        Connection con=null;
        PreparedStatement ps=null;
        try {
            con= Dbutils.getConnection();
            String sql="insert into User values(null,?,?)";
            ps= con.prepareStatement(sql);
            ps.setString(1,user.getUserName());
            ps.setString(2,user.getPassword());
            //数据库原表ALTER TABLE USER MODIFY userName VARCHAR(20) CHARACTER SET "utf8";不然无法识别中文
            int row = ps.executeUpdate();
            return  row;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                Dbutils.close(con,ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return 0;
    }
}
package com.servlet;

import com.dao.UserDao;
import com.modal.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "RegisterServlet")
public class RegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("userName");
        String password = request.getParameter("password");
        System.out.println("用户名:"+name+",密码:"+password);
        User user = new User(name, password);
        UserDao userDao = new UserDao();
        int i = userDao.creatUser(user);
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        if(i==1) {
            writer.write("<h1>注册成功</h1>");
        }else{
            writer.write("<h1>注册失败</h1>");
        }
        writer.close();
    }

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

二、重定向与转发

1.重定向

  • 客户浏览器发送http请求,当web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,
  • 请求url是新的location地址,服务器根据此请求寻找资源并发送给客户
  • 借助javax.servlet.http.HttpServletResponse接口void sendRedirect(String location)
  • 特点:重定向之后,浏览器地址栏的URL会发生改变;重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象;重定向的URL可以是其它项目工程 

技术分享图片

 

package com;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "RedirectServlet")
public class RedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("开始重定向");
        response.sendRedirect("https://www.jiegeng.com/bz=18052915230356");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册登录页面</title>
</head>
<body>
    <form action="redirect" method="post">
        重定向页面 <br>
    <input type="submit" value="提交"></form>

</body>
</html>

2.转发

  • 一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,转发的各个组件会共享RequestResponse对象。 
方法声明 功能介绍
Object getAttribute(String
name)
将指定属性值作为对象返回,若给定名称属性不存
在,则返回空值
void setAttribute(String
name,Object o)
在此请求中存储属性值

 

方法声明 功能介绍
RequestDispatcher
getRequestDispatcher(String path)
返回一个RequestDispatcher对象,该对象充当位
于给定路径上的资源的包装器

 

方法声明 功能介绍
void forward(ServletRequest
request, ServletResponse response)
将请求从一个servlet转发到服务器上的另一个资
源(ServletJSP文件或HTML文件)
  • 特点:转发之后浏览器地址栏的URL不会发生改变;转发过程中共享Request对象;转发的URL不可以是其它项目工程。

  

package com;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ForwardServlet")
public class ForwardServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("开始转发");
        request.setAttribute("key1","value1");
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("forwardEnd");
        requestDispatcher.forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
//--------------------------
package com;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ForwardEndServelet")
public class ForwardEndServelet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("转发成功");
        System.out.println(request.getAttribute("key1"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册登录页面</title>
</head>
<body>
    <form action="forward" method="post">
        转发页面 <br>
    <input type="submit" value="提交"></form>

</body>
</html>

3.重定向与转发的区别

技术分享图片

 

 

  •  请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是通过容器转交给另外一个Web组件继续处理,服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次
  • 地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
  • 是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
  • 跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源
  • 发生行为不同:重定向是客户端行为,重定向可以转到不同服务器的项目中,转发是服务器端行为,只能在本站目录下的项目被使用;
  • Request对象:重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象,而转发是共享Request对象

三、Servlet线程安全

  • 服务器在收到请求之后,会启动一个线程来进行相应的请求处理。
  • 默认情况下,服务器为每个Servlet只创建一个对象实例。当多个请求访问同一个Servlet时,会有多个线程访问同一个Servlet对象,此时就可能发生线程安全问题。
  • 多线程并发逻辑,需要使用synchronized对代码加锁处理,但尽量避免使用
package com;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "ThreadServlet",urlPatterns = "/thread")
public class ThreadServlet extends HttpServlet {
    private String name;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        synchronized (this) {
            System.out.println("线程测试");
            //1.获取名字
            name=request.getParameter("name");
            System.out.println(name);
            //2.启动线程睡眠
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //3.输出姓名
        PrintWriter writer = response.getWriter();
        writer.write("<h1>"+name+"</h1>");
        writer.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>thread测试</title>
</head>
<body>

<iframe width="300px" height="100px" src="thread?name=admin1"></iframe>
    <iframe width="300px" height="100px" src="thread?name=admin2"></iframe>
    <iframe width="300px" height="100px" src="thread?name=admin3"></iframe>

</body>
</html>

四. 状态管理

  • Web程序基于HTTP协议通信,而HTTP协议是无状态的协议,一旦服务器响应完客户的请求之后,就断开连接,而同一个客户的下一次请求又会重新建立网络连接。
  • 把浏览器与服务器之间多次交互作为一个整体,将多次交互所涉及的数据保存下来,即状态管理。
  • 多次交互的数据状态可以在客户端保存,也可以在服务器端保存。状态管理主要分为以下两类:
    • 客户端管理:将状态保存在客户端。基于Cookie技术实现。
    • 服务器管理:将状态保存在服务器端。基于Session技术实现。

1.cookie技术

    • cookie表示客户端以-形式进行保存的一种技术。
    • 浏览器向服务器发送请求时,服务器将数据以Set-Cookie消息头的方式响应给浏览器,浏览器会将这些数据以文本文件的方式保存起来。
    • 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器 
    • 使用javax.servlet.http.Cookie类的构造方法实现Cookie的创建。
      方法声明 功能介绍
      void addCookie(Cookie cookie) 添加参数指定的对象到响应
    • 使用javax.servlet.http.HttpServletResponse接口的成员方法实现Cookie的添加。
      方法声明 功能介绍
      Cookie[] getCookies() 返回此请求中包含的所有Cookie对象
    • 使用javax.servlet.http.HttpServletRequest接口的成员方法实现Cookie对象的获取。
      方法声明 功能介绍
      String getName() 返回此Cookie对象中的名字
      String getValue() 返回此Cookie对象的数值
      void setValue(String newValue) 设置Cookie的数值

servlet核心技术2

原文:https://www.cnblogs.com/forever-fate/p/14298794.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!