JavaEE/servlet3

新建Dynamic Web Project

新建Dynamic Web Project -->File->New->Other->Web->Dynamic Web Project—>创建servlet类–>导入servlet-api.jar–》编辑映射到web.xml—>右键项目启动服务器 -> Run As -> Run on Server—>选择服务器(Tomcat)–>选择服务器位置—>当前项目作为部署在tomcat中–>访问http://127.0.0.1:8080/j2ee/hello

java project项目切换到动态Web项目

右键项目j2ee->properties->Project Facets->Convert to faceted form...

设置content directory

设置content directory顶折纠问

  1. 勾选Dynamic Web Module
  2. 勾选之后,会出现 Furthe configuration available …, 点击
  3. 动态web项目的默认内容目录是WebContent,而 j2ee这个项目的对应目录是 web, 所以这里要输入web
  4. 点击ok

导入已存在的动态项目

菜单->File->Import->General->Existing Projects Into Workspace
在Select root directory中输入动态Web项目的目录。
注:如图所示,会发现无法点击Finish,此时只需要点一下 Brower 就可以点击Finish了。 如果怎么也点不出来,是因为Eclipse里面已经管理着一个同名项目,把那个同名项目从Eclipse删除掉就好了
在这里插入图片描述
导入后启动服务器,再配置服务器即可

两个问题

无法配置Tomcat

出现如图问题:在这里插入图片描述
解决办法:
定位到

E:\project\.metadata\.plugins\org.eclipse.core.runtime\.settings

删除:

org.eclipse.wst.server.core.prefs
org.eclipse.jst.server.tomcat.core.prefs

接着重启eclipse即可

无法启动Tomcat

有时候点击Eclipse中的Tomcat启动,会弹出这么个对话框,表示启动失败:
在这里插入图片描述
解决办法粗暴一点:菜单-Window->Show View->Other->Server->Servers此时会出现如图所示的Tomcat v7.0 Server…
右键点击,选择Delete
然后再重新配置 通过Eclipse启动Tomcat-Run On Server 即可~
在这里插入图片描述## IDEA创建项目
一般项目:
Web  项目:IDEA2.-的版本取消了直接创建web项目,而是先创建普通项目,然后右键->add-->选择里面的web,确定
在这里插入图片描述
详细步骤
其中在设置部署这一步:
接下来就需要指定当前项目部署到Tomcat中

  1. 点击Deployment
  2. 点击加号
  3. 点击Artifact…
  4. 自动生成 j2ee.war
    最后. 点击OK(需要把Deployment下面的Application context里面的内容清空)
    快捷键:

CRUD

CRUD是常见的页面功能,即我们常说的增删改查(操作时需要注意,服务器request请求回来的都是字符串,如果请求回来的是数字,如hp,需要Float.parseFloat(request.getparameter(“hp”))进行转换 )
C - Creation 增加
R - Retrieve 查询
U - Update 修改
D - DELETE 删除
在这里插入图片描述

准备工作

建好动态项目之后,

  1. 准备实体类Hero,Hero类有id,name,hp,damage等属性。
    并且为每一个属性提供public的gettersetter
package bean;
public class Hero {
    public int id;
    public String name;
    public float hp;
    public int damage;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getHp() {
        return hp;
    }
    public void setHp(float hp) {
        this.hp = hp;
    }
    public int getDamage() {
        return damage;
    }
    public void setDamage(int damage) {
        this.damage = damage;
    }   
}
  1. 准备DAO 类 HeroDAO
    准备一个HeroDAO,提供增加,删除,修改,查询等常规数据库操作方法
package dao;

import java.sql.Connection;
import java.sql.DriverManager;
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 bean.Hero;

public class HeroDAO {

    public HeroDAO() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root",
                "admin");
    }

    public int getTotal() {
        int total = 0;
        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "select count(*) from hero";

            ResultSet rs = s.executeQuery(sql);
            while (rs.next()) {
                total = rs.getInt(1);
            }

            System.out.println("total:" + total);

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return total;
    }

    public void add(Hero hero) {

        String sql = "insert into hero values(null,?,?,?)";
        try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

            ps.setString(1, hero.name);
            ps.setFloat(2, hero.hp);
            ps.setInt(3, hero.damage);

            ps.execute();

            ResultSet rs = ps.getGeneratedKeys();
            if (rs.next()) {
                int id = rs.getInt(1);
                hero.id = id;
            }
        } catch (SQLException e) {

            e.printStackTrace();
        }
    }

    public void update(Hero hero) {

        String sql = "update hero set name= ?, hp = ? , damage = ? where id = ?";
        try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

            ps.setString(1, hero.name);
            ps.setFloat(2, hero.hp);
            ps.setInt(3, hero.damage);
            ps.setInt(4, hero.id);

            ps.execute();

        } catch (SQLException e) {

            e.printStackTrace();
        }

    }

    public void delete(int id) {

        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "delete from hero where id = " + id;

            s.execute(sql);

        } catch (SQLException e) {

            e.printStackTrace();
        }
    }

    public Hero get(int id) {
        Hero hero = null;

        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "select * from hero where id = " + id;

            ResultSet rs = s.executeQuery(sql);

            if (rs.next()) {
                hero = new Hero();
                String name = rs.getString(2);
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                hero.name = name;
                hero.hp = hp;
                hero.damage = damage;
                hero.id = id;
            }

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return hero;
    }

    public List<Hero> list() {
        return list(0, Short.MAX_VALUE);
    }

    public List<Hero> list(int start, int count) {
        List<Hero> heros = new ArrayList<Hero>();

        String sql = "select * from hero order by id desc limit ?,? ";

        try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

            ps.setInt(1, start);//第一个问号的值
            ps.setInt(2, count);//第二个问号的值

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Hero hero = new Hero();
                int id = rs.getInt(1);
                String name = rs.getString(2);
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                hero.id = id;
                hero.name = name;
                hero.hp = hp;
                hero.damage = damage;
                heros.add(hero);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return heros;
      }}
  1. 创建表Hero的SQL
    用于创建表Hero的SQL语句:
DROP TABLE IF EXISTS `hero`;
 
CREATE TABLE `hero` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `hp` float DEFAULT NULL,
  `damage` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. 为web应用导入mysql-jdbc的jar包
    为web应用导入mysql-jdbc的jar包为项目导入mysql-jdbc的jar包不同,其作用的web应用在tomcat中运行起来后,能够找到jar包中的类。

所以需要把 mysql 的jar包放在WEB-INF/lib 目录下。 注: 放在WEB-INF/lib
下指的是能够web应用中找到对应的class,如果要在eclipse中做调试,还是需要为项目添加该jar才可以。

提要:

做一个Hero的维护页面需要一些通用的操作,比如增加,删除,编辑,修改,查询等。

每个不同的操作,都需要一个对应的Servlet,除了做Hero之外,还会做到其他的一些表的相关操作,所以好的规范会对将来的维护更有好处。

一般会这样命名,以查询为例 HeroListServlet : [表][行为]Servlet 这样一种命名规则。

所以对于Hero而言就会如此命名:
增加 HeroAddServlet 删除 HeroDeleteServlet
编辑 HeroEditServlet 修改 HeroUpdateServlet 查询 HeroListServlet

查询

编写 HeroListServlet
在HeroListServlet中,会使用HeroDAO把数据查询出来,然后拼接成一个table用于显示其内容:

package servlet;
 
import java.io.IOException;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import bean.Hero;
import dao.HeroDAO;
 
public class HeroListServlet extends HttpServlet {
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
         
        List<Hero> heros = new HeroDAO().list();
 
        StringBuffer sb = new StringBuffer();
        sb.append("<table align='center' border='1' cellspacing='0'>\r\n");
        sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>\r\n");
 
        String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>\r\n";
 
        for (Hero hero : heros) {
            String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage());
            sb.append(tr);
        }
 
        sb.append("</table>");
 
        response.getWriter().write(sb.toString());
    }
}

配置web.xml:
在web.xml中把路径 listHero映射到HeroListServlet上。

...<servlet>
        <servlet-name>HeroListServlet</servlet-name>
        <servlet-class>servlet.HeroListServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HeroListServlet</servlet-name>
        <url-pattern>/listHero</url-pattern>
    </servlet-mapping>  

重启tomcat,访问http://127.0.0.1/listHero(没有listHero.html)

增加

1 准备增加的页面 addHero.html
在web目录下增加addHero.html

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

表示用UTF-8显示中文,同时浏览器也会使用UTF-8编码提交中文

form:
action设置为addHero路径
method设置为post 也是为了提交中文
<!DOCTYPE html>
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<form action="addHero" method="post">
     名字 : <input type="text" name="name"> <br>
血量 : <input type="text" name="hp"> <br>
伤害: <input type="text" name="damage"> <br>
         <input type="submit" value="增加 ">
</form>

2 编写 HeroAddServlet
HeroAddServlet 中根据浏览器传过来的参数,创建一个Hero对象。 接着通过HeroDAO把该对象保存到数据库中。
最后使用客户端跳转(response.sendRedirect)到listHero查看所有的Hero,就能看到新加入的Hero对象了

request.setCharacterEncoding("UTF-8");

表示使用UTF-8的方式获取浏览器传过来的中文
增加时需要new HeroDAO().add(hero);,创建HeroDao对象,才能操作

package servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import bean.Hero;
import dao.HeroDAO;
 
public class HeroAddServlet extends HttpServlet {
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        request.setCharacterEncoding("UTF-8");
 
        Hero hero = new Hero();
        hero.setName(request.getParameter("name"));
        hero.setHp(Float.parseFloat(request.getParameter("hp")));
        hero.setDamage(Integer.parseInt(request.getParameter("damage")));
         
        new HeroDAO().add(hero);
 
        response.sendRedirect("listHero");
         
    }
}

3 配置web.xml
在web.xml中设置路径addHero对应HeroAddServlet:

'添加:'
    <servlet>
        <servlet-name>HeroAddServlet</servlet-name>
        <servlet-class>servlet.HeroAddServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HeroAddServlet</servlet-name>
        <url-pattern>/addHero</url-pattern>
    </servlet-mapping>   

4 重启tomcat,访问增加页面

http://127.0.0.1/addHero.html

删除

1 提供delete超链
修改HeroLIstServlet,多一个单元格,是一个超链
超链的href属性指向地址 /deleteHero?id=217(每条不同的记录id不一样)
可以在左下角的浏览器状态栏里看到
2 修改HeroListServlet
为table新增加一列delete,对于每条hero数据,增加一个delete超链

'修改:'
        StringBuffer sb = new StringBuffer();
        sb.append("<table align='center' border='1' cellspacing='0'>\r\n");
        sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td><td>delete</td></tr>\r\n");
 
        String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td><td><a href='deleteHero?id=%d'>delete</a></td></tr>\r\n";
 
        for (Hero hero : heros) {
            String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage(),hero.getId());
            sb.append(tr);
        }

2 编写HeroDeleteServlet
首先获取参数id–>然后通过HeroDAO根据id,删除该对象–>然后客户端跳转到 /listHero

package servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import dao.HeroDAO;
 
public class HeroDeleteServlet extends HttpServlet {
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        int id = Integer.parseInt(request.getParameter("id"));
         
        new HeroDAO().delete(id);
 
        response.sendRedirect("/listHero");      
    }
}

3 配置web.xml

    <servlet>
        <servlet-name>HeroDeleteServlet</servlet-name>
        <servlet-class>servlet.HeroDeleteServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HeroDeleteServlet</servlet-name>
        <url-pattern>/deleteHero</url-pattern>
    </servlet-mapping> 

4 重启tomcat,首先访问查询页面

http://127.0.0.1/listHero

编辑

点击编辑(激活超链/editHero)–>调用web.xml中配置的/editHero映射的servlet文件–>在servlet 文件中实现了html(填写编辑的)内容–>html在把更新的数据抛给/updateHero–>调用web.xml中配置的/updateHero映射的servlet文件,完成更新

修改HeroListServlet
新增加一列 edit,里面放上指向 /editHero的超链

'修改:'
        StringBuffer sb = new StringBuffer();
        sb.append("<table align='center' border='1' cellspacing='0'>\r\n");
        sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td><td>edit</td><td>delete</td></tr>\r\n");
 
        String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td><td><a href='editHero?id=%d'>edit</a></td><td><a href='deleteHero?id=%d'>delete</a></td></tr>\r\n";
 
        for (Hero hero : heros) {
            String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage(),hero.getId(),hero.getId());

2 准备HeroEditServlet
HeroEditServlet 根据浏览器传过来的id获取一个hero对象
然后根据这个hero对象,准备一个类似add.html的页面,不同之处在于每个输入框都是有值的。
最后还会提供一个type="hidden"的input,用于提交id到路径/updateHero
(需要在有updateHero所对应的servlet 操作才可以正常运行,否则就只能填写,没有真正的编辑)

package servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import bean.Hero;
import dao.HeroDAO;
 
public class HeroEditServlet extends HttpServlet {
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        int id = Integer.parseInt(request.getParameter("id"));
 
        Hero hero = new HeroDAO().get(id);
 
        StringBuffer format = new StringBuffer();
        response.setContentType("text/html; charset=UTF-8");
 
        format.append("<!DOCTYPE html>");
 
        format.append("<form action='updateHero' method='post'>");
        format.append("名字 : <input type='text' name='name' value='%s' > <br>");
        format.append("血量 : <input type='text' name='hp'  value='%f' > <br>");
        format.append("伤害: <input type='text' name='damage'  value='%d' > <br>");
        format.append("<input type='hidden' name='id' value='%d'>");
        format.append("<input type='submit' value='更新'>");
        format.append("</form>");
 
        String html = String.format(format.toString(), hero.getName(), hero.getHp(), hero.getDamage(), hero.getId());
 
        response.getWriter().write(html);
 
    }
}

3 配置web.xml
在web.xml中把 /editHero路径映射到 HeroEditServlet类上

    <servlet>
        <servlet-name>HeroEditServlet</servlet-name>
        <servlet-class>servlet.HeroEditServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HeroEditServlet</servlet-name>
        <url-pattern>/editHero</url-pattern>
    </servlet-mapping>

更新

更新是通过上一步的编辑实现的
编写 HeroUpdateServlet:

HeroUpdateServlet 根据浏览器提交的id name hp damage创建一个Hero对象
然后调用HeroDAO的update,进行更新 更新结束后,客户端跳转到 /listHero

package servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import bean.Hero;
import dao.HeroDAO;
 
public class HeroUpdateServlet extends HttpServlet {
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        request.setCharacterEncoding("UTF-8");
 
        Hero hero = new Hero();
        hero.setId(Integer.parseInt(request.getParameter("id")));
        hero.setName(request.getParameter("name"));
        hero.setHp(Float.parseFloat(request.getParameter("hp")));
        hero.setDamage(Integer.parseInt(request.getParameter("damage")));
 
        new HeroDAO().update(hero);
        response.sendRedirect("/listHero");
    }
}

2 配置web.xml
新增对路径 /updateHero的映射

    <servlet>
        <servlet-name>HeroUpdateServlet</servlet-name>
        <servlet-class>servlet.HeroUpdateServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>HeroUpdateServlet</servlet-name>
        <url-pattern>/updateHero</url-pattern>
    </servlet-mapping>

弊端

使用Servlet进行CRUD开发。 其中一个比较明显的弊端就是在Servlet编写html代码很痛苦,效率不高,可读性差,难以维护。
最好可以在html文件里面写html代码,同时又能在里面调用java的变量,那么这样就需要学习JSP了。

JSON

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值