使用Eclipse开发一个简单的Java Web项目

1.打开Eclipse,新建一个Dynamic Web Project,名字随意,不要用中文;

提示:
Dynamic web project 动态网络项目,动态web,包含动态信息,如jsp页面等。
Static web project 静态网络项目,静态web,不包含动态信息,仅包含静态页面文件。
web fragment project 项目网络碎片,是Servlet3.0支持的新特性,可以将一个web工程分成多个部分来开发调试。

2.新建一个login.jsp和或者是login.html,该页面具有登录的相关信息;

提示:
页面以及页面的所有资源都应该放在WebContent根目录。

<div class="login">
<form action="login.do" method="post">
    <div class="box png">
        <div class="logo png"></div>
        <div class="input">
            <div class="log">
                <div class="name">
                    <label>用户名</label><input type="text" class="text" id="username" placeholder="用户名" name="username" tabindex="1" />
                </div>
                <div class="pwd">
                    <label>密 码</label><input type="password" class="text" id="password" placeholder="密码" name="password" tabindex="2" />
                    <input type="submit" class="submit" tabindex="3" value="登录" />
                    <input type="button" class="submit" tabindex="3" value="注册" onclick="toLcal()" />
                    <div class="check"></div>
                </div>
                <div class="tip"></div>
            </div>
        </div>
    </div>
</form>
</div>

3.在下方找到servers插件,双击Tomcat v7.0 Server at localhost,找到Prots(8005,8080,8009),然后修改端口号8080为8088,其他的不需要修改;

提示:
如果使用的是MySQL数据库,也可以不改,MySQL数据库的默认端口号为3306。
Oracle数据库的默认端口号也是8080,为了防止Tomcat服务器端口与Oracle数据库端口发生冲突。

4.在Tomcat v7.0 Server at localhost上右键,选择Add and Remove…,把刚刚新建的工程添加进去;

5.启动tomcat,然后在浏览器上书写127.0.0.1:8088/项目名称/页面名称(或者localhost:8088/项目名称/页面名称),看看是否能够成功浏览页面;

提示:
如果出现文字乱码的情况,先右键Login.jsp打开配置,更改编码格式为utf-8,在Login.jsp源码中修改charset=utf-8。

6.在form表单的action属性上添加一个具体的请求名,比如说功能如果是登录的话,就写login.do,如果是注册的话,就写reg.do等;

7.在Eclipse的src下面新建一个包,比如nsy.test.servlet,然后再在该包下新建一个servlet,然后先设置编码格式,然后获取前台的数据,然后展示到页面上。

提示:
第一种方法,右键新建的nsy.test.servlet包,选择servlet文件,servlet窗口的第一步,是写明该servlet的名称,点击next,第二个窗口,修改第二个框的内容为你刚刚在页面所写的请求名,比如你在页面的action中写了login.do,那么在这里就只需要写/login.do即可,再点击next,勾选下方的service方法,如果不需要使用doget和dopost方法,则取消勾选doget和dopost方法。
第二种方法,右键新建的nsy.test.servlet包,创建一个java类,名称为LoginServlet,在superclass那一栏,点击browse,这个类要继承javax.servlet.http下的httpservlet,然后在创建的servlet里面,新建一个service方法,书写一个service,然后按alt+/,根据提示,选择参数的类型带有Http的那个方法。

protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //2、获取到前台发送的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        PrintWriter pw = resp.getWriter();
        //3、把用户名和密码发送给dao层进行数据库的处理并且拿到结果
        UserDao dao = new UserDao();
        NoteDao ndao = new NoteDao();
        try {
            if(dao.login(username, password)){
                //登录成功之后,查询需要展示在主页面的日志的所有信息,并且得到一个日志的集合
                ArrayList<Note> list = ndao.findAll();
                //拿到集合之后,把该集合的内容存储起来发送给前台页面
                req.getSession().setAttribute("list", list);
                //通过转发跳到主页面
                resp.sendRedirect("nguboke.jsp");//重定向
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

提示:
出现404错误的几种可能性:
 (1).打开页面就出现404
  a.服务器地址写错,或者是服务器根本没开;
  b.把页面放在非webroot目录下的其他位置了;
 (2).页面点击按钮或者是点击超链接的时候出现404
  检查web.xml里面,看你的配置请求是否写错了;

8.在web.xml文件里面添加<servlet>标签和<servlet-mapping>标签,并填写好里面相应的值;

提示:
Tomcat7默认支持Servlet3规范,而Servlet3规范默认支持注解,所以在Eclipse创建Dynamic Web Project时,默认不会生成web.xml,也不会引用手动创建的web.xml。
第一种方法,创建项目时点击Next按钮,不要点击Finish,直到Web Module,勾选“Generate web.xml deployment descriptor”,这样创建项目会自动包含web.xml。
第二种方法,若在创建项目时忘记勾选,右击工程,选择Java EE Tools —> Generate Deployment Descriptor Stub,Eclipse会自动添加web.xml。

如何打开域名+工程名就能够访问默认的页面:
在web.xml里面,有个标签叫做welcome-file-list,里面有个welcome标签,把你要默认打开的文件名更换里面的文件名,就可以实现。

9.web.xml如何接收到前端的请求以及如何访问指定的java代码
 (1)你在前端点击按钮或者是点击超链接的时候,会发送一个请求给服务器;
 (2)服务器会拿着这个请求到web.xml里面的<servlet-mapping>标签里面去和<url-pattern>标签里面的内容进行适配,一旦适配成功,就会拿着该<servlet-mapping>标签里面的<servlet-name>的值去<servlet>标签中寻找里面的<servlet-name>的值进行匹配,匹配成功,则会去运行该<servlet>标签里面的<servlet-class>里面的类里面的service方法;

<?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">
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hckj.teaching.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>CheckUsernameServlet</servlet-name>
    <servlet-class>cn.hckj.teaching.servlet.CheckUsernameServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>RegServlet</servlet-name>
    <servlet-class>cn.hckj.teaching.servlet.RegServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>FindNoteServlet</servlet-name>
    <servlet-class>cn.hckj.teaching.servlet.FindNoteServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CheckUsernameServlet</servlet-name>
    <url-pattern>/checkUsername.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RegServlet</servlet-name>
    <url-pattern>/reg.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>FindNoteServlet</servlet-name>
    <url-pattern>/showNoteDetail.do</url-pattern>
  </servlet-mapping>

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

10.创建mysql数据库,使用SQL语句创建一个test数据库,然后在test数据库中创建一个users表,最后在users表中插入几条数据;

CREATE DATEBASE test; //创建数据库

CREATE TABLE `users` (
  `id` INT(20) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) DEFAULT NULL,
  `password` VARCHAR(20) DEFAULT NULL,
  `name` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
); //创建表

INSERT INTO `users` VALUES ('01','zhaolei','111','赵雷'); //插入数据
INSERT INTO `users` VALUES ('02','liyun','222','李云');

提示:
如何开启mysql数据库
 (1).去官网下载mysql数据库安装文件,然后进行安装;
 (2).下载一个mysql管理器,然后进行安装,然后使用mysql管理器就可以进行各种数据库操作了;

11.让java能够连接到mysql数据库
 (1).把mysql的驱动包放到webcontent下面的web-inf下面的lib目录下;

提示:
Mysql的jdbc驱动包可以在mysql官网进行下载。

 (2).在src的根目录下创建db_mysql.properties文件,用来保存mysql数据库的用户名、密码、URL地址和使用的驱动;

username=root
password=root
url=jdbc\:mysql\://localhost\:3306/test
driver=com.mysql.jdbc.Driver

提示:
创建db_mysql.properties文件,右键src,选择file,然后在出现的界面中,输入文件名和后缀,点击finish。

 (3).在原始的包下新建一个utils的包,然后创建一个ConnectionUtils.java(数据库连接工具类),放置到该包下;

public class ConnectionUtils {
       //定义之前写在properties里面的内容对应的变量名
    static String username;
    static String password;
    static String url;
    static String driver;
    static {
        try {
            //调用方法,该方法就是用来获取properties里面的各种变量对应的值的
            getParam();
            //加载jar包文件
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 读取db_mysql.properties文件,并且把name所对应的值给取出来
     * @throws IOException
     */
    private static void getParam() throws IOException {
        //下面4行的含义就是读取指定的文件
        ClassLoader cl= ConnectionUtils.class.getClassLoader();//获取类加载器
        InputStream is = cl.getResourceAsStream("db_mysql.properties");//通过类加载器来加载制定的文件
        Properties pro = new Properties();//因为加载的文件是properties文件,所以创建一个Properties对象
        pro.load(is);//使用该properties对象去读取该加载的文件流
        //然后通过指定的key来获取对应的value
        username = pro.getProperty("username");
        password = pro.getProperty("password");
        url = pro.getProperty("url");
        driver = pro.getProperty("driver");
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
    public static void main(String[] args) throws SQLException {
        getConnection();
    }
}

 (4).开启mysql数据库,然后在ConnectionUtils.java中执行该文件,如果控制台不报错,意味着数据库连接成功。

12.在src的原来的包下面创建一个dao包,该包的作用就是所有的数据库操作都在这里面进行;

13.在dao包下面新建一个UserDao的类,该类的作用就是用户的所有数据库操作都在这里面进行;

14.在UserDao下面新建一个方法,该方法就是用户的登录方法,具体内容参考UserDao.java文件;

public class UserDao {
    public boolean login(String username,String password) throws SQLException{
        //1、连接数据库
        Connection conn = ConnectionUtils.getConnection();
        //2、书写sql语句
        String sql = "select * from users where username=? and password = ?";
        //3、通过连接来创建一个用来加载sql语句的对象--PreparedStatement
        PreparedStatement psmt = conn.prepareStatement(sql);
        //4、查看sql语句中是否存在问号,有问号的话,根据问号的类型来进行塞值
        psmt.setString(1, username);//第一个参数指的是第几个问号,从1开始,第二个参数指的是你要替换问号的数据
        psmt.setString(2, password);//
        //5、执行该加载sql语句的PreparedStatement对象,并且关注该sql语句是哪种,如果是增删改的话,那么执行的语句为executeUpdate,如果是查的话,执行的语句为executeQuery
        //如果是增删改的话,执行了之后,返回的是一个int类型的值,代表的是这个sql语句执行之后影响到了几行,如果是查的话,那么返回的是一个ResultSet的对象,它里面包含了完整的查询的结果
        ResultSet rs = psmt.executeQuery();
        if(rs.next()){
            return true;
        }
        return false;
    }

    public void reg(Users u) throws SQLException{
        //1、连接数据库
        Connection conn = ConnectionUtils.getConnection();
        //2、书写sql语句
        String sql = "insert into users(username,password,name) values(?,?,?)" ;
        //3、通过连接来创建一个用来加载sql语句的对象--PreparedStatement
        PreparedStatement psmt = conn.prepareStatement(sql);
        //4、查看sql语句中是否存在问号,有问号的话,根据问号的类型来进行塞值
        psmt.setString(1, u.getUsername());//第一个参数指的是第几个问号,从1开始,第二个参数指的是你要替换问号的数据
        psmt.setString(2, u.getPassword());//
        psmt.setString(3, u.getName());//
        //5、执行该加载sql语句的PreparedStatement对象,并且关注该sql语句是哪种,如果是增删改的话,那么执行的语句为executeUpdate,如果是查的话,执行的语句为executeQuery
        //如果是增删改的话,执行了之后,返回的是一个int类型的值,代表的是这个sql语句执行之后影响到了几行,如果是查的话,那么返回的是一个ResultSet的对象,它里面包含了完整的查询的结果
        psmt.executeUpdate();
    }

    public boolean usernameIsIn(String username) throws SQLException{
        //1、连接数据库
        Connection conn = ConnectionUtils.getConnection();
        //2、书写sql语句
        String sql = "select * from users where username=?";
        //3、通过连接来创建一个用来加载sql语句的对象--PreparedStatement
        PreparedStatement psmt = conn.prepareStatement(sql);
        //4、查看sql语句中是否存在问号,有问号的话,根据问号的类型来进行塞值
        psmt.setString(1, username);//第一个参数指的是第几个问号,从1开始,第二个参数指的是你要替换问号的数据
        //5、执行该加载sql语句的PreparedStatement对象,并且关注该sql语句是哪种,如果是增删改的话,那么执行的语句为executeUpdate,如果是查的话,执行的语句为executeQuery
        //如果是增删改的话,执行了之后,返回的是一个int类型的值,代表的是这个sql语句执行之后影响到了几行,如果是查的话,那么返回的是一个ResultSet的对象,它里面包含了完整的查询的结果
        ResultSet rs = psmt.executeQuery();
        if(rs.next()){
            return true;
        }
        return false;
    }
}

15.在LoginServlet里面获取到前端的username和password之后,调用UserDao里面的login方法,完成用户的登录校验;

16.在UserDao下面继续新建一个reg的方法,我们发现里面的参数太多,所以我们把参数进行一个封装,即在原始包下新建一个pojo的包,然后新建一个Users的类,里面的字段和表Users保持一直,注意属性要使用private修饰,然后右键选择source,然后选择get和set…完成代码的自动构建;

public class Users {
    private int id;
    private String username;
    private String password;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int 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 getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

17.在UserDao的reg方法里面,模拟之前的login方法,直接把内容copy过来,修改几个地方:
 (1).修改sql语句;
 (2).修改?号对应的setXXX的值;
 (3).根据不同的返回类型来修改return的值,或者是去掉return;
 (4).根据不同的sql语句的类型,来修改executeUpdate或者是executeQuery;

18.根据reg的方法,来实现注册的完整功能:
 (1).创建一个reg.jsp的页面,并且修改请求为reg.do;
 (2).创建一个RegServlet的类;
 (3).在RegServlet类里面的service方法中获取到前台注册的所有信息;
 (4).把信息封装成一个Users对象,然后传入到UserDao中的reg方法里面;
 (5).注册成功之后,在页面进行打印展示;

19.如何实现在注册页面,用户名填写完成之后,就进行校验该用户名是否存在
 (1).在UserDao里面添加一个判断用户名是否存在的方法,代码见UserDao.java文件;
 (2).在reg.jsp页面的用户名的input标签上添加一个失去焦点事件,并且把当前input的value给传输到js中;
 (3).在script标签里面写一个对应的函数,注意添加参数,先使用alert进行测试,看函数是否正常被触发,看值是否正确传送过来;
 (4).在函数测试完成之后,把ajax的代码copy到当前函数里面,然后修改open后面的第二个参数,第二个参数修改为你要发送给后台的请求名比如,login.do,reg.do,checkUsername.do之类的,如果有数据要发送给后台的话,通过问号后面接key=value的形式进行传递,比如你要发一个判断用户名的请求,并且你还想把用户名传递给后台,那么你的写法是:”checkusername.do?username=”+username,前面的username是key,后面的username是变量名;
 (5).创建一个请求名和ajax中的请求名对应的servlet,然后在service方法里面写一个输出语句,重启服务器刷新页面,测试看请求是否能够到达服务器!
 (6).如果上一步能够正常的接收到ajax的请求的话,那么我们就按照之前LoginServlet的写法,把里面的代码copy过来,然后只获取username,然后调用UserDao里面的usernameIsIn的方法,把用户名传输过去,然后得到结果,进行打印出来,测试看是否成功!
 (7).如果上一步能够正常的打印出用户名存在或者不存在的话,那么现在要做的就是把这个存在和不存在的数据发送给前台jsp页面,通过pw.write的方法来传输字符串;
 (8).在js函数里面的if….里面alert一下xhr.responseText的值,看是否能够获取到后台发送的数据;
 (9).能够正常接收到之后,在用户名的input窗口下面,新建一个span的标签,然后在接收到数据的js里面获取到该span标签对象,然后修改里面的innnerHTML的值;

按照第八步的书写,会发现,现在可以完成用户名是否存在的判断,但是判断之后,把鼠标继续放回到用户名的位置之后,数据没有清空,并且提示也仍然存在;
获取焦点事件onfoucs

未完待续………………………………..


-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!