晨跑调查程序学习笔记
程序开发思路导图:
1.网站开发思路,从jsp页面开始写起,然后写servlet,之后写类来保存获取的表单变量,最后将获取的变量写入到数据库。
2.开始写代码前先检查字符集,检查方法:
选中所建立的工程——>Alt+Enter——>修改字符集要尽量和数据库默认字符集一致。
注意:我的MySQL安装时默认字符集不是utf-8,为了和老师讲的一致,我将其修改成了UTF-8.
MySQL修改默认字符集的方法见:http://www.cnblogs.com/xingyunblog/p/3836299.html
加载MySQL驱动包
3.编写表单代码时表单Get和Post的选择,如果无汉字,则用get或者post都可以,默认get方式。但如有汉字则只能用post,否则可能会出现乱码问题。
4.table属性:border边框宽度,bgcolor背景颜色
5.input的type属性radio是单选按钮,type属性submit是提交。name属性必须一样,checked属性为默认选择项,value属性区分选项。
6.<td>属性colspan是跨列,有多少<td></td>就有多少列。
index.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>投票页面</title> </head> <body bgcolor="#6699FF"> <form action="voteServlet" > <table bgcolor="#eeeeee" align="center"> <caption><h2>晨跑情况调查表</h2></caption> <tr> <td> <input type="radio" name="vote" value="A" checked="checked"/>坚持跑下去</td> <td> <input type="radio" name="vote" value="B"/>跑一学期试试</td> <td> <input type="radio" name="vote" value="C"/>不想跑了</td> </tr> <tr align="center"> <td colspan="3"> <input type="submit"value="提交"/></td> </tr> </table> </form> </body> </html>
7.写servlet时直接新建servlet就可以图形用户界面配置web.xml.
8.web.xml中的<url-pattern>/voteServlet</url-pattern>中的url地址一定要和<form action="voteServlet">保持一致。
voteServlet.java源码如下:
package servlets; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import service.IDBService; import service.IDBServiceImpl; import beans.User; //表单提交servlet类 public class VoteServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取用户提交参数vote的值 response.setContentType("text/html;charset=utf-8"); String vote=request.getParameter("vote"); //获取客户端用户IP String ip=request.getRemoteAddr(); //创建对象user类,跳转到User类 User user=new User(); user.setIp(ip); user.setVote(vote); //创建IDBService服务类,创建IDBserviceImpl服务实现类 //IDBserviceImpl类实现IDBService类接口 IDBService service=new IDBServiceImpl(); //判断数据库中是否存在这个ip User findUser=service.selectUserByIP(ip); String message="对不起,您已经投过票了,谢谢您的支持!"; //如果findUser不为null,则说明该用户已经投过票了,不能再投了。 if(findUser==null){ service.insertUser(user); message="您的投票已完成,谢谢您的支持!"; } //session保存反馈结果字符串 HttpSession session=request.getSession(); session.setAttribute("message",message); //跳转页面 RequestDispatcher rd=request.getRequestDispatcher("message.jsp"); rd.forward(request, response); } //doPost调用doGet方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
9.servlet中通过request.getParameter(变量名name字符串) 获取提交的数据.
10.面向对象类中不要定义成int类型,因为定义成Interger在后面代码中才可以进行判空操作。
11.定义好变量后,就可以使用source——>Generate Getters and Setters...快速重写赋值和修改变量方法。
编写好User.java代码如下:
package beans; import java.io.Serializable; //此类对象user类,用来赋值保存获取的变量。 public class User implements Serializable { private Integer id;//这里不要定义成int类型,不然无法进行判空操作。 private String ip; private String vote; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getVote() { return vote; } public void setVote(String vote) { this.vote = vote; } }
建立数据库如下:
12.图形用户界面建立数据库后,选中数据库——右键——转储Sql文件——>选择保存路径,
13.记事本方式打开sql文件,添加语句create datebase run_data;use run_data;将修改后的文件保存。
run_data.sql文件修改后如下:
/* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50130 Source Host : localhost:3306 Source Database : run_data Target Server Type : MYSQL Target Server Version : 50130 File Encoding : 65001 Date: 2014-10-03 10:12:09 */ create datebase run_data; use run_data; SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `users` -- ---------------------------- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(255) DEFAULT NULL, `vote` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of users -- ----------------------------
14.新建一个Folder,起一个名字,将刚才生成的sql文件复制到这个目录下。
15.在eclipse下,package, source folder, folder都是文件夹. 但它们有区别如下:
1.sourceFolder靠"/"来进行上下级划分,package靠“.”来进行上下级划分。
2.source folder下能建package,而package下不能建source folder.
3.package:当你在建立一个package时,它自动建立到source folder下,也只能建立在这个目录之下.
4.source folder:存放java源代码的文件夹,当然也包括一些package文件夹,还可以包含其他文件.
5.项目构建后,source folder里面的java自动编译成class文件到相应的bin文件夹中,其他文件也会移到到相应的目录下.
6.folder:里面可以放入任何文件.包括java源文件,jar文件,其他文件(例如,图片,声音等).
7.folder:如果里面含有java源文件,不管程序是否正确,eclipse都不会报错,把它们当做普通文件处理.
但是项目如果要使用这里面的文件,情况就不同了.
8. package:ECLIPSE会自动编译此文件夹同里面所包含的代码跟package
9.source folder:ECLIPSE会自动编译里面的类文件,但文件夹本身不会编译
10.folder:下面的类,ECLIPSE不会编译到指定存放编译文件包里.
16.创建接口IDBService,选中IDBService service=new IDBServiceImpl();中的IDBService后右键——>Create Interface,包名service.
IDBService.java代码如下:
package service; import java.util.List; import beans.User; //提供服务类 public interface IDBService { //插入数据 void insertUser(User user); //查询所有用户 List<User> selectAllUsers(); //查询所有用户IP User selectUserByIP(String ip); List<User> selectUsersByVote(String vote); }
17.选中IDBService service=new IDBServiceImpl();中的IDBServiceImpl按下Alt+1快速修复,新建class类。
IDBServiceImpl.java代码编写完毕如下:
package service; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import utils.JdbcUtil; import beans.User; //具体实现服务类 public class IDBServiceImpl implements IDBService { private Connection con; private Statement stmt; private PreparedStatement ps; private ResultSet rs; public void insertUser(User user) { try { //获取数据库链接 con=JdbcUtil.getConnection(); //SQL语句 String sql="insert into users(ip,vote)values(?,?)"; //创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 ps=con.prepareStatement(sql); //将获取的变量赋值插入到数据库内 ps.setString(1,user.getIp()); ps.setString(2,user.getVote()); //执行SQL更新语句 ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs,ps,con); } } public List<User> selectAllUsers() { List<User> allUsers=new ArrayList<User>(); try { con=JdbcUtil.getConnection(); String sql="select id,ip,vote from users"; stmt=con.createStatement(); rs=stmt.executeQuery(sql); while(rs.next()){ User user=new User(); user.setId(rs.getInt("id")); user.setIp(rs.getString("ip")); user.setVote(rs.getString("vote")); allUsers.add(user); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JdbcUtil.close(rs,stmt,con); } return allUsers; } public User selectUserByIP(String ip) { User user=null; try { con=JdbcUtil.getConnection(); String sql="select id from users where ip=?"; ps=con.prepareStatement(sql); ps.setString(1,ip); rs=ps.executeQuery(); if(rs.next()){ user=new User(); user.setId(rs.getInt("id")); } } catch (SQLException e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs,ps,con); } return user; } public List<User> selectUsersByVote(String vote) { List<User> users=new ArrayList<User>(); try { con=JdbcUtil.getConnection(); String sql="select id from users where vote=?"; ps=con.prepareStatement(sql); ps.setString(1,vote); rs=ps.executeQuery(); while(rs.next()){ User user=new User(); user=new User(); user.setId(rs.getInt("id")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs,ps,con); } return users; } }
创建JdbcUtil.java工具类。
JdbcUtil.java编写完毕代码如下:
package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcUtil { //加载数据库驱动方法 private static Connection con; static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //数据库链接方法 public static Connection getConnection(){ try { if(con==null||con.isClosed()) { String url="jdbc:mysql://127.0.0.1:3306/run_data"; String user="root"; String password="toor"; con=DriverManager.getConnection(url, user, password); } } catch (SQLException e) { e.printStackTrace(); } return con; } //数据库关闭方法 public static void close(ResultSet rs,Statement stmt,Connection con){ try { if(rs!=null)rs.close(); if(stmt!=null)stmt.close(); if(con!=null)con.close(); } catch (SQLException e) { e.printStackTrace(); } } //可选择关闭方法 public static void close(Object obj){ try { if(obj!=null&&obj instanceof ResultSet) ((ResultSet)obj).close(); if(obj!=null&&obj instanceof Statement) ((Statement)obj).close(); if(obj!=null&&obj instanceof Connection)((Connection)obj).close(); } catch (SQLException e) { e.printStackTrace(); } } }
创建servlet.java类,统计投票结果。
编写完毕ResultServlet.java代码如下:
package servlets; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import service.IDBService; import service.IDBServiceImpl; import beans.User; //查询结果SERVELTE类 //查看结果请输入URL地址/resultServlet public class ResultServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { IDBService service=new IDBServiceImpl(); List<User> allUsers=service.selectAllUsers(); List<User> usersVoteA=service.selectUsersByVote("A"); List<User> usersVoteB=service.selectUsersByVote("B"); List<User> usersVoteC=service.selectUsersByVote("C"); HttpSession session=request.getSession(); session.setAttribute("allUsers",allUsers); session.setAttribute("usersVoteA",usersVoteA); session.setAttribute("usersVoteB",usersVoteB); session.setAttribute("usersVoteC",usersVoteC); RequestDispatcher rd=request.getRequestDispatcher("/showResults.jsp"); rd.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
新建showResults.jsp页面
showResults.jsp代码如下:
<%@ page import="java.util.*,beans.*" pageEncoding="utf-8"%> <html> <head> <title>投票结果</title> </head> <body bgcolor="#6699FF"> <% List<User> allUsers =(List<User>)session.getAttribute("allUsers"); List<User> usersVoteA =(List<User>)session.getAttribute("usersVoteA"); List<User> usersVoteB =(List<User>)session.getAttribute("usersVoteB"); List<User> usersVoteC =(List<User>)session.getAttribute("usersVoteC"); %> <center> <h2>晨跑情况调查结果</h2></center> <center> 票数统计:共计<%=allUsers.size() %>票.</center> <br> <table border="1" bgclore="#eeeeee"align="center"> <tr> <td>坚持跑下去</td> <td><%=usersVoteA.size() %></td> </tr> <tr> <td>跑一学期试试</td> <td><%=usersVoteB.size() %></td> </tr> <tr> <td>不想跑了</td> <td><%=usersVoteC.size() %></td> </tr> </table> </body> </html>
同上建立message.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String message=(String)session.getAttribute("message"); %> <%=message%>
web.xm最终代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>VoteServlet</servlet-name> <servlet-class>servlets.VoteServlet</servlet-class> </servlet> <servlet> <servlet-name>ResultServlet</servlet-name> <servlet-class>servlets.ResultServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>VoteServlet</servlet-name> <url-pattern>/voteServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ResultServlet</servlet-name> <url-pattern>/resultServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
代码目录如图所示:
进行发布配置。
启动tomcat:
项目源码下载地址:http://pan.baidu.com/s/1c03ZjFE
投票:
打开浏览器输入:http://127.0.0.1:8080/RunProgram/
查看结果:
打开浏览器输入:http://127.0.0.1:8080/RunProgram/resultServlet
程序截图: