重温 Servlet


前言

已经有几百年没碰servlet了,前天觉得公司查看打卡记录很不方便,于是有了一个想法,做一个给同事们查看打卡记录的app,领导觉得很好,便下午开工了,这是个小应用,服务端当然不会用ssm了,用jdbc即可,再想想用回servlet好了,毕竟当年也是servlet入门的,对韩顺平老师的超强sqlHelper至今记忆犹新。

Servlet3.1 新特性:
  • 在Servlet 3.0中,一些新的注释javax.servlet.annotation介绍了包。我们在web上使用的配置。xml现在可以通过使用注释来实现。

  • 现在,我们可以没有web . xml的Servlet、过滤器ServletContextListener。

  • 它们只打算提供元数据,我们仍然需要扩展相应的类或实现相应的接口。

  • 在web inf / classes目录或在web inf / lib中的jar中扫描注释。

  • 扫描在部署时完成。

  • 如果在web - inf / lib中有很多JAR文件,那么servlet容器的启动可能会非常慢,因为每一个JAR文件中的每一个类文件都必须被扫描。我们可以通过在web . xml中使用metadata - complete =“true”来关闭jar扫描。

  • 网络。xml仍然可以被选择性地覆盖注释配置。

  • 使用注释,我们没有办法配置类似的东西:提供一个欢迎页面列表、定义错误页面和提供筛选器顺序。我们必须使用web . xml。这些注释是为了提高开发人员的生产力而引入的。它们有更好的默认值,并基于约定优于配置范型。


这里写图片描述


这里写图片描述


项目结构

韩顺平经典的结构,controller -> service -> sqlHelper , 很简单的应用,没用接口编程,直接用类传递。


这里写图片描述


这里给出后端代码
  • User.java
package com.xfoce.domain;

import java.util.Date;

public class User {

    private Integer id;

    private String username;

    private String password;

    private String email;

    private Integer status;

    private Date regTime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getRegTime() {
        return regTime;
    }

    public void setRegTime(Date regTime) {
        this.regTime = regTime;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password="
                + password + ", email=" + email + ", status=" + status
                + ", regTime=" + regTime + "]";
    }

}


  • UserService.java
package com.xforce.service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import com.xfoce.domain.User;
import com.xforce.utils.DateUtil;
import com.xforce.utils.SqlHelper;

public class UserService {

    //添加user
    public void addUser(User user) {
        String sql = "insert into a_user(username, password, email, status) values(?,?,?,?)";
        String[] parameters = {user.getUsername(),user.getPassword(),user.getEmail(),user.getStatus()+"", DateUtil.StringToDate(new Date())};
        SqlHelper.executeUpdate(sql, parameters);
    }

    //验证user
    public User checkUser(User user) {
        String sql = "select * from a_user where username = ? and password = ?";
        String[] parameters = {user.getUsername(),user.getPassword()};
        ResultSet result = SqlHelper.executeQuery(sql, parameters);
        User s_user = new User();
        List<User> users = new ArrayList<User>();
        try {
            while(result.next()) {
                s_user.setId(result.getInt("id"));
                s_user.setEmail(result.getString("email"));
                s_user.setStatus(result.getInt("status"));
                s_user.setRegTime(result.getDate("reg_time"));
                s_user.setUsername(result.getString("username"));
                s_user.setPassword(result.getString("password"));
                users.add(s_user);
            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(users.size() == 0 || users == null) {
            return null;
        }
        else{
            return users.get(0);
        }

    }

}


  • SqlHelper.java
package com.xforce.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.sql.*;
public class SqlHelper
{
    //定义变量
    private static Connection ct = null;
    //大多数情况下用preparedstatement替代statement
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;

    //连接数据库的参数
    private static String url = "";
    private static String username = "";
    private static String driver = "";
    private static String passwd = "";

    private static CallableStatement cs = null;
    public static CallableStatement getCs()
    {
        return cs;
    }
    private static Properties  pp = null;
    private static InputStream fis = null;
    //加载驱动,只需要一次,用静态代码块
    static
    {
        try
        {
            //从dbinfo.properties
            pp = new Properties();
            fis=SqlHelper.class.getClassLoader().getResourceAsStream("jdbc.properties");
            //fis = new FileInputStream();
            pp.load(fis);
            url = pp.getProperty("jdbcUrl");
            username = pp.getProperty("username");
            driver = pp.getProperty("driverClasss");
            passwd = pp.getProperty("password");

            Class.forName(driver);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            { fis.close();}
            catch(IOException e) {e.printStackTrace();}
            fis = null;//垃圾回收站上收拾
        }

    }
    //得到连接
    public static Connection getConnection()
        {
            try
            {ct = DriverManager.getConnection(url,username,passwd);}
            catch(Exception e) {e.printStackTrace();}
            return ct;
        }


//*************callPro1存储过程函数1*************   
    public static CallableStatement callPro1(String sql,String[] parameters)
    {
        try{
            ct = getConnection();
            cs = ct.prepareCall(sql);
            if(parameters!=null){
                for(int i=0;i<parameters.length;i++){
                 cs.setObject(i+1,parameters[i]);
                }
            }   
            cs.execute();
        }
        catch(Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage());}
        finally
        { close(rs,cs,ct);}
        return cs;
    }

//*******************callpro2存储过程2************************
public static CallableStatement callPro2(String sql,String[] inparameters,
Integer[] outparameters)
{
    try
    {
        ct = getConnection();
        cs = ct.prepareCall(sql);
        if(inparameters!=null)
        {
            for(int i=0;i<inparameters.length;i++)
            {
                cs.setObject(i+1,inparameters[i]);
            }
        }
    //cs.registerOutparameter(2,oracle.jdbc.OracleTypes.CURSOR);
        if(outparameters!=null)
        {
            for(int i=0;i<outparameters.length;i++)
            {
                cs.registerOutParameter(inparameters.length+1+i,outparameters[i]);
            }
        }
        cs.execute();
    }
    catch(Exception e) {
        e.printStackTrace(); throw new RuntimeException(e.getMessage());
    }
    finally
    {

    }
    return cs;
}
    public static ResultSet executeQuery(String sql,String[] parameters)
    {
        try
        {
            ct=getConnection();
            ps=ct.prepareStatement(sql);
            if(parameters!=null)
            {
                for(int i=0;i<parameters.length;i++)
                {
                    ps.setString(i+1,parameters[i]);
                }
            }
            rs = ps.executeQuery();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
        finally
        {

        }
        return rs;
    }


    public static Connection getCt()
    {
        return ct;
    }
    public static PreparedStatement getPs()
    {
        return ps;
    }
    public static ResultSet getRs()
    {
        return rs;
    }


    public static void executeUpdate2(String[] sql,String[][] parameters)
    {
        try
        {
            ct = getConnection();
            ct.setAutoCommit(false);

            for(int i=0;i<sql.length;i++)
            {

                if(null!=parameters[i])
                {
                    ps = ct.prepareStatement(sql[i]);
                    for(int j=0;j<parameters[i].length;j++)
                    {
                        ps.setString(j+1,parameters[i][j]);
                    }
                    ps.executeUpdate();
                }

            }


            ct.commit();


        }catch (Exception e)
        {
            e.printStackTrace();
            try
            {
                ct.rollback();
            }
            catch (SQLException e1)
            {
                e1.printStackTrace();
            }
            throw  new RuntimeException(e.getMessage());
        }finally
        {
            close(rs,ps,ct);
        }

    }

    //先写一个update、delete、insert
    //sql格式:update 表名 set 字段名 =?where 字段=?
    //parameter神应该是(”abc“,23)
    public static void executeUpdate(String sql,String[] parameters)
    {
        try
        {
            ct=getConnection();
            ps = ct.prepareStatement(sql);
            if(parameters!=null)
            {
                for(int i=0;i<parameters.length;i++)
                {
                    ps.setString(i+1,parameters[i]);
                }

            }
            ps.executeUpdate();
        }
        catch(Exception e)
        {
            e.printStackTrace();//开发阶段
            //抛出异常
            //可以处理,也可以不处理
            throw new RuntimeException(e.getMessage());
        }
        finally
        {
            close(rs,ps,ct);
        }
    }

    public static void close(ResultSet rs,Statement ps,Connection ct)
    {
        //关闭资源(先开后关)
        if(rs!=null)
        {
            try
            {
                rs.close();
            }
            catch(SQLException e)
            {
                e.printStackTrace();
            }
            rs=null;
        }
        if(ps!=null)
        {
            try
            {
                ps.close();
            }
            catch(SQLException e)
            {
                e.printStackTrace();
            }
            ps=null;
        }
        if(null!=ct)
        {
            try
            {
                ct.close();
            }
            catch(SQLException e)
            {
                e.printStackTrace();
            }
            ct=null;
        }
    }
}


  • DateUtil.java
package com.xforce.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

    public static String StringToDate(Date date) {
        SimpleDateFormat sdf = null;
        try {
            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        return sdf.format(date);
    }
}


  • Login.java
package com.xforce.controller;

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

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 com.xfoce.domain.User;
import com.xforce.service.UserService;
@WebServlet({"/login"})
public class Login extends HttpServlet {


    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }


    public 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 UserService();
        user = userService.checkUser(user);
        if(user != null) {
            request.setAttribute("user", user);
            request.getRequestDispatcher("/WEB-INF/main.jsp").forward(request, response);
        }
        else {
            request.setAttribute("message", "账号或密码有误!");
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        }
    }


    public void init() throws ServletException {
        // Put your code here
    }

}


  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>

</web-app>


  • pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>Attendance</groupId>
  <artifactId>Attendance</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>Attendance</name>
  <description/>
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

     <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

        <!-- 添加mysql驱动依赖 -->
      <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.29</version>
    </dependency>

        <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    </dependencies>

    <build>
        <sourceDirectory>src/main/java</sourceDirectory>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


效果


这里写图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值