Servlet开发

实习第三周2

Servlet对包的需求更少的了。因为没用Spring,数据库的连接和操作需要自己来实现,这样就需要mysql-connector-java-5.1.36.jar。为了以后配置方便,我还把数据配置写到了一个db.property

url=jdbc:mysql://localhost:3306/iciss?useUnicode=true&characterEncoding=UTF-8
username=root
password=

这里还用了一个convertList函数把数据库的返回ResultSet转化为List

package common;

import java.io.InputStream;
import java.sql.*;
import java.util.*;

/**
 * Created by PRO_HD_Rorz on 2015/7/28.
 */
public class Dbcon {

    private Connection conn = null;
    private Statement st = null;
    private ResultSet rs = null;

    protected ErrorLogger errorLogger = new ErrorLogger();

    public Dbcon() {
        /*databaseName = "iciss";
        userName = "root";
        password = "";*/
        String url = getproperty("url");
        String username = getproperty("username");
        String password = getproperty("password");
        try {
            //写入驱动所在处,打开驱动
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            //数据库,用户,密码,创建与具体数据库的连接
            conn = DriverManager.getConnection(url, username, password);
            //创建执行sql语句的对象
            st = conn.createStatement();

        } catch (Exception e) {
            errorLogger.write("数据库连接失败\t" + url + "\r\n" + e.toString());

        }

    }

    public Dbcon(String databaseName, String userName, String password) {
        /*databaseName = "iciss";
        userName = "root";
        password = "";*/
        try {
            //写入驱动所在处,打开驱动
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            //数据库,用户,密码,创建与具体数据库的连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/?useUnicode=true&characterEncoding=UTF-8" + databaseName, userName, password);
            //创建执行sql语句的对象
            st = conn.createStatement();

        } catch (Exception e) {
            errorLogger.write("数据库连接失败" + e.toString());

        }

    }

    public String getproperty(String key)
    {
        String path = this.getClass().getResource("/").getPath();
        Properties prop = new Properties();
        try
        {
            //InputStream is = this.getClass().getResourceAsStream("../" + path + "db.property");
            InputStream is = this.getClass().getResourceAsStream("../../" + "db.property");
            prop.load(is);
            if(is != null)
            {
                is.close();
            }
        }
        catch(Exception e)
        {
            errorLogger.write("数据库配置文件载入失败" + "\t" + "../../" + "db.property" + "\r\n" + e.toString() + e.getStackTrace());
        }

        return prop.getProperty(key);

    }

    public String query(String sql, int n) {
        String result = "";
        try {
            rs = st.executeQuery(sql);
            while (rs != null && rs.next()) {
                result = rs.getString(n);
                //列的记数是从1开始的,这个适配器和C#的不同
            }

            rs.close();
            return result;
        } catch (Exception e) {
            errorLogger.write("执行sql失败\t" + sql + "\r\n" + e.toString());

            return null;
        }
    }

    public int query(String sql) {
        int row = 0;
        try {
            row = st.executeUpdate(sql);
            this.close();
            return row;
        } catch (Exception e) {
            errorLogger.write("执行sql失败\t" + sql + "\r\n" + e.toString());
            this.close();
            return row;
        }
    }

    public List query(String sql, Object... args) {
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            for(int i=0 ; i<args.length ; i++)
            {
                pst.setObject(i+1, args[i]);
            }
            pst.execute();
            List re = convertList(pst.getResultSet());
            this.close();
            return re;
        } catch (Exception e) {
            errorLogger.write("执行sql失败\t" + sql + "\r\n" + e.toString());
            this.close();
            return null;
        }
    }

    public int update(String sql, Object... args) {
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            for(int i=0 ; i<args.length ; i++)
            {
                pst.setObject(i+1, args[i]);
            }
            int re = pst.executeUpdate();
            this.close();
            return re;
        } catch (Exception e) {
            errorLogger.write("执行sql失败\t" + sql + "\r\n" + e.toString());
            this.close();
            return 0;
        }
    }

    public void close() {
        try {
            if (rs != null)
                this.rs.close();
            if (st != null)
                this.st.close();
            if (conn != null)
                this.conn.close();

        } catch (Exception e) {
            errorLogger.write("关闭数据库连接失败" + e.toString());
        }
    }

    private static List convertList(ResultSet rs) throws SQLException {
        List list = new ArrayList();
        ResultSetMetaData md = rs.getMetaData();
        int columnCount = md.getColumnCount();
        //Map rowData;
        while (rs.next()) {
            //rowData = new HashMap(columnCount);
            Map rowData = new HashMap();
            for (int i = 1; i <= columnCount; i++) {
                rowData.put(md.getColumnName(i), rs.getObject(i));
            }
            list.add(rowData);
        }
        return list;
    }


}

这里没用log4j,我自己实现了2个日志类,一个记录事件,一个记录错误

package common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by PRO_HD_Rorz on 2015/7/29.
 */
public class InfoLogger {


    private String logpath = "e:\\sources\\iciss\\log\\log.txt";
    private OutputStreamWriter outputStreamWriter;

    public OutputStreamWriter getOutputStreamWriter() {
        return outputStreamWriter;
    }

    public void setOutputStreamWriter(OutputStreamWriter outputStreamWriter) {
        this.outputStreamWriter = outputStreamWriter;
    }

    public InfoLogger() {
        try
        {
            File log =new File(logpath);
            if(!log.exists()){
                log.createNewFile();
            }
            FileOutputStream fileOutputStream = new FileOutputStream(log, true);//追加写入
            outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
        }
        catch (Exception e)
        {
            System.out.println("infolog文件打开错误\r\n" + e.toString() + "\r\n");
        }

    }

    public void write(String event)
    {
        try
        {
            Date date = new Date();
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = format.format(date);

            outputStreamWriter.write(time + ":  " + event + "\r\n");
            outputStreamWriter.flush();
        }
        catch (Exception e)
        {
            System.out.println("infolog文件写入错误\r\n" + e.toString() + "\r\n");
        }
    }

}

写了一个Servlethelp类用于存储数据库连接和2个日志,给servlet继承

package common;

import javax.servlet.http.HttpServlet;

/**
 * Created by PRO_HD_Rorz on 2015/7/29.
 */
public class Servlethelp extends HttpServlet {
    //protected Dbcon dbcon = new Dbcon("iciss","root","");
    protected Dbcon dbcon = new Dbcon();
    protected InfoLogger infologger = new InfoLogger();
    protected ErrorLogger errorLogger = new ErrorLogger();
}

Intellij IDEA在创建新的servlet时好像不会自动在web.xml中增加配置,需要手动增加

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <display-name>iciss</display-name>
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>servlet.Test</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
     <url-pattern>/test</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>servlet.Login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/Login</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

登陆处理,登陆后在服务器端的session中存储当前用户信息User。

其中response.sendRedirect可以重定向url

request.getRequestDispatcher(page).forward(request, response)则是由服务器来获取那个页面再转发给浏览器,不会改变url

package servlet;


import common.Servlethelp;
import common.User;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;

/**
 * Created by PRO_HD_Rorz on 2015/7/28.
 */
@WebServlet(name = "Login")
public class Login extends Servlethelp {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String currEntity = "登陆";
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        String username = "";
        String password = "";
        String page = "/Login.jsp";
        HttpSession session = request.getSession();


        try {
            username = request.getParameter("username");
            password = request.getParameter("password");
            username = "";
            String sql = "select userid, password, role from users where username like '%?%'";
            List re = dbcon.query(sql, username);
            if(re.size() >= 1)
            {
                if(((Map)re.get(0)).get("password").equals(password))
                {
                    page = "/test";
                    String userid = (String) ((Map)re.get(0)).get("userid");
                    String role = (String) ((Map)re.get(0)).get("role");

                    SaveToSession(session, userid, username, role);
                    infologger.write(username + "\t" + currEntity);

                    out.println("success");
                    return;
                }
                else
                {
                    out.println("fail");
                }
            }
            else
            {
                out.println("fail");
            }



        } catch (Exception e) {
            errorLogger.write(currEntity + "\t" + e.toString());
        }
        finally {
            RequestDispatcher rd = request.getRequestDispatcher(page);
            rd.forward(request, response);
        }
    }

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

    }

    public void SaveToSession(HttpSession session, String userid, String username ,String role)
    {
        User user = new User();
        user.setRole(role);
        user.setUserid(userid);
        user.setUsername(username);

        session.setAttribute("user", user);

    }
}

登出则直接销毁那个session

package servlet;

import common.Servlethelp;
import common.User;

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

/**
 * Created by PRO_HD_Rorz on 2015/7/31.
 */
@WebServlet(name = "Logout")
public class Logout extends Servlethelp {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String currEntity = "登出";
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        User currUser = (User) session.getAttribute("user");
        String username = currUser.getUsername();
        String userid = currUser.getUserid();

        session.invalidate();

        infologger.write(username + "\t" + currEntity);

        response.sendRedirect("Login.jsp");
    }
}

接收表单参数可以用String name = request.getParameter(“name”)

接收一个数组时则需要String name[] = request.getParameterValues(“name”);

获取DBcon返回的list时还需要转化为map

package servlet;

import common.Servlethelp;
import common.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.*;

/**
 * Created by PRO_HD_Rorz on 2015/7/30.
 */
@WebServlet(name = "QuestionsManager")
public class QuestionsManager extends Servlethelp {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String currEntity = "问题管理";
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        User currUser = (User) session.getAttribute("user");
        String currname = currUser.getUsername();
        String currid = currUser.getUserid();

        String ques_id = UUID.randomUUID().toString();
        String ref = request.getParameter("ref");
        String ques = request.getParameter("ques");
        int qtype = Integer.parseInt(request.getParameter("qtype"));
        String remark = request.getParameter("remark");
        String help = request.getParameter("help");
        String opt_dest[] = request.getParameterValues("opt_dest");
        String opt_score[] = request.getParameterValues("opt_score");
        String opt_lremark[] = request.getParameterValues("opt_lremark");

        Map map = request.getParameterMap();
        String sql1 = "insert into questionsdb values (?,?,?,?,?,?)";
        int re1 = 0;

        try{
            re1 = dbcon.update(sql1, ques_id, ref, ques, qtype, remark, help);
        }
        catch (Exception e)
        {

            out.println("fail");
        }

        List re2 = new ArrayList();
        String sql2 = "select ques_id from questionsdb where ref like ? and ques like ? and qtype = ? and remark like ? and help like ?";
        try{
            re2 = dbcon.query(sql2, ref, ques, qtype, remark, help);
        }
        catch (Exception e)
        {

            out.println("fail");
        }

        if(re2.size() >= 1)
        {
            int quesid = Integer.parseInt((String) ((Map)re2.get(0)).get("ques_id"));
            int re3 = 0;
            String sql3 = "insert into optiondb values (NULL,?,?,?,?)";
            for(int i=0 ; i<opt_dest.length ; i++ )
            {
                try{
                    re3 = dbcon.update(sql3, quesid, opt_dest[i], opt_score[i], opt_lremark[i]);
                }
                catch (Exception e)
                {

                    out.println("fail");
                }
                if(re3 >= 1)
                {
                    out.println("Success");
                    return;
                }
                else
                {
                    out.println("fail");
                }
            }
        }
        else
        {
            out.println("fail");
        }

        out.println("fail");


    }  

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

    }
}

这里扔个test.jsp。实际上在tomcat上运行System.out.printIn会把内容打印到tomcat的log里(

<%@ page import="common.User" %>
<%--
  Created by IntelliJ IDEA.
  User: PRO_HD_Rorz
  Date: 2015/7/29
  Time: 13:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    String urole = "";
    String uname = "";
    if(session.getAttribute("user") != null)
    {
        urole = ((User)session.getAttribute("user")).getRole();
        uname = ((User)session.getAttribute("user")).getUsername();
    }
    else
    {
        response.sendRedirect("Login.jsp");
    }

    System.out.println(session.getId());
    System.out.println(uname);

%>
<html>
<head>
    <title>test</title>
</head>
<body>
    <form action="test" method="get">
        <input name="action" value="edit" type="hidden" hidden="hidden">
        <input name="toadd" value="aaaa" type="text">
        <input name="toadd" value="bbb" type="text">
        <input name="toadd" value="cccc" type="text">
        <input name="username" value="123" type="text">
        <input name="password" value="111" type="text">
        <input type="submit">
    </form>
    <%
         out.println(uname);
    %>
</body>
</html>

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注