前言
已经有几百年没碰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>