之前的文章中我们介绍了通过servlet显示html和css代码的方法。这次我们的工作是如何实现页面的跳转。
在web.xml配置文件的web-app标签中中添加:
<servlet>
<servlet-name>ListHeroServlet</servlet-name>
<servlet-class>ListHeroServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListHeroServlet</servlet-name>
<url-pattern>/listHero</url-pattern>
</servlet-mapping>
意思就是一但浏览器侦测到/listHero指令,就将工作权交给ListHeroServlet类。这样我们在浏览器中输入对应的指令,就能通过这个类调用servlet来打印html和css代码在浏览器上了。
那么我们如何实现上图中超链接的跳转呢?我们看到,在ListHeroServlet类中,以编辑按钮为例,我们的html语句是这样的:
<td><a href='editHero?id=%d'>edit</a></td>
可以看到我们的超连接地址是…/editHero?id=…,我们可以通过修改配置文件,映射/editHero指令去一个类,由那个类调用servlet显示一个页面。这样就完成了跳转。在web.xml配置文件的web-app标签下新增:
<servlet>
<servlet-name>EditHeroServlet</servlet-name>
<servlet-class>EditHeroServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EditHeroServlet</servlet-name>
<url-pattern>/editHero</url-pattern>
</servlet-mapping>
然后编写EditHeroServlet类:
import bean.Hero;
import dao.HeroDAO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class EditHeroServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html; charset=UTF-8");
int id = Integer.parseInt(request.getParameter("id"));
Hero hero = new HeroDAO().get(id);
StringBuffer format = new StringBuffer();
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);
}
}
首先设置服务器响应编码为utf-8,防止出现中文显示乱码:
response.setContentType("text/html; charset=UTF-8");
然后采用之前介绍过的方法使用servlet显示html字符串就可以了。这里需要注意,首先,由于提交的信息可能带有中文,所以方法必须指定为post。其次,可以看到我们把表单的提交action定义为updateHero,所以必须在配置文件中将这个action映射到DAO层对应的方法中。在web.xml配置文件中的web-app标签下新增:
<servlet>
<servlet-name>UpdateHeroServlet</servlet-name>
<servlet-class>UpdateHeroServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UpdateHeroServlet</servlet-name>
<url-pattern>/updateHero</url-pattern>
</servlet-mapping>
从这段代码看出,我们使用UpdateHeroServlet类来对updateHero这个指令进行处理。所以我们还需要编写一个UpdateHeroServlet类:
import bean.Hero;
import dao.HeroDAO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class UpdateHeroServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws 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");
}
}
调用DAO层的方法更新完信息之后,使用客户端跳转的方式跳转回listHero界面。
response.sendRedirect("/listHero");
至此,我们就开发完成了使用超链接来进行数据库的管理与页面跳转。这算是servlet+JDBC最基本的应用项目了,即增删改查(CRUD)操作。剩下的删除功能只需如法炮制即可。