jsp页面跳转(商品管理系统)
今天主要是在做这个页面的跳转,做到最后发现其实在页面跳转中很多的代码主要都是用来验证的,因为我们在做web开发的时候,我们的对象是不确定的,所以我们应该把使用者看做会给我们找出各种错误的人,以他们的角度来看自己的代码到底会发生什么样的问题,这样才能够对症下药,对每种可能出现的坏情况都做好各种验证,避免我们的服务器被别人乱搞坏了!现在,我还是把各个页面都总结一下,方便日后查看:
1.index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<%
String code = request.getParameter("code"); //获得前面URL重写所传过来的值,然后根据各种值判断显示不同的提示结果
if(code != null && "1001".equals(code)){
%>
<div style="color:red;">用户名或密码错误!</div>
<%
} else if(code != null && "1002".equals(code)){
%>
<div style="color:yellow;">用户名或密码不能为空!</div>
<%
}
%>
<form action="login.jsp" method="post">
姓名:<input type="text" name="username" /> <br />
密码:<input type="password" name="password" />
<input type="submit" value="提交" />
</form>
</body>
</html>
2.login.jsp
<%@page import="com.kaishengit.entity.Prod"%>
<%@page import="com.kaishengit.dao.ProdDao"%>
<%@page import="com.kaishengit.dao.UserDao"%>
<%@page import="com.kaishengit.entity.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8"); //解决表单post提交方式的中文乱码问题
String name = request.getParameter("username");
String pwd = request.getParameter("password");
//判断用户名和密码是否正确,这叫做服务器端验证,保证不让别人直接敲login.jsp页面进来,而是必须通过表单提交的方式进来才可以
if(name == null || "".equals(name) || pwd == null || "".equals(pwd)){
response.sendRedirect("index.jsp?code=1002");
return; //在jsp中,即使页面跳转了,可是本页的代码还是会一直执行到最后,所以要想达到不让程序执行的效果,必须加一个return,强制结束代码的执行
}
UserDao ud = new UserDao();
User u = ud.findByName(name);
if(u != null && u.getPassword().equals(pwd)){
session.setAttribute("user", u); //登陆成功之后由服务器返回一个sessionID
response.sendRedirect("home.jsp");
} else {
System.out.println("登陆失败!");
response.sendRedirect("index.jsp?code=1001"); //URL重写,重定向式跳转只能通过这种方法来传值
}
%>
3.main.jsp
<%@page import="com.kaishengit.entity.Prod"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<html>
<head>
<title>My JSP 'main.jsp' starting page</title>
</head>
<body>
<%
List<Prod> list = (List<Prod>)request.getAttribute("prodList");
%>
<a href="add.jsp">添加新商品</a>
<table border="1" width="40%">
<tr>
<th>产品名称</th>
<th>产品价格</th>
<th>操作</th>
</tr>
<%
for(Prod p : list){
%>
<tr>
<td><%=p.getProdName() %></td>
<td><%=p.getPrice() %></td>
<td>
<a href="update.jsp?id=<%=p.getId()%>">修改</a> <%--在超链接跳转的时候顺便把id传过去 --%>
<a href="del.jsp?id=<%=p.getId()%>">删除</a>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
4.add.jsp(添加商品页)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<%
String code = request.getParameter("code");
if("10001".equals(code)){
%>
<div style="color:red;">请输入用户名或密码!</div>
<%
} else if("10002".equals(code)){
%>
<div style="color:green;">请输入正确的价格!</div>
<%
}
%>
<form action="save.jsp" method="post">
商品名称:<input type="text" name="prodName" /> <br />
商品价格:<input type="text" name="price" />
<input type="submit" value="添加" />
</form>
</body>
</html>
5.save.jsp(对添加商品页的验证)
<%@page import="com.kaishengit.util.StringUtil"%>
<%@page import="com.kaishengit.entity.Prod"%>
<%@page import="com.kaishengit.dao.ProdDao"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<%
request.setCharacterEncoding("UTF-8");
String prodName = request.getParameter("prodName");
String price = request.getParameter("price");
if(StringUtil.isEmpty(prodName) || StringUtil.isEmpty(price)){ //判断表单中所提交的内容是否为空
response.sendRedirect("add.jsp?code=10001");
return; //这里一定要加return,因为jsp中即使跳转了本页的代码还是会一直执行下去,如果不强行阻止的话后面就会出现问题了,
}
try{
ProdDao pd = new ProdDao();
pd.add(prodName, Float.valueOf(price)); //这里要进行异常处理,防止有的在输入价格的时候输的不是数字,导致类转换异常,比如输个“xxx”
response.sendRedirect("home.jsp"); // 重定向到home.jsp,由它来执行查询的操作,避免了表单的重复提交问题
} catch(NumberFormatException e) {
response.sendRedirect("add.jsp?code=10002");
}
%>
6.del.jsp(删除商品)
<%@page import="com.kaishengit.dao.ProdDao"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<%
String id = request.getParameter("id");
ProdDao pd = new ProdDao();
pd.del(Integer.valueOf(id));
response.sendRedirect("home.jsp");
%>
7.update.jsp(取得修改前的默认值)
<%@page import="com.kaishengit.entity.Prod"%>
<%@page import="com.kaishengit.dao.ProdDao"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<%
String id = request.getParameter("id");
ProdDao pd = new ProdDao();
Prod prod = pd.findById(Integer.valueOf(id)); //根据从前面页面传过来的id查出prod对象,然后再将这个对象传给下一个页面
request.setAttribute("prod", prod);
RequestDispatcher rd = request.getRequestDispatcher("edit.jsp");
rd.forward(request, response);
%>
8.edit.jsp(修改商品页)
<%@page import="com.kaishengit.entity.Prod"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<%
Prod prod = (Prod)request.getAttribute("prod"); //接受上一个页面所传过来的prod对象
%>
<body>
<form action="new.jsp" method="post">
<input type="hidden" name="id" value=<%=prod.getId() %> /> <%-- type为hidden表示这个内容会传到下一个页面,但是不会被显示,这种一般用于必须要传递但是又没必要显示的值 --%>
商品名称:<input type="text" name="prodName" value=<%=prod.getProdName() %> /> <br />
商品价格:<input type="text" name="price" value=<%=prod.getPrice() %> />
<input type="submit" value="修改" />
</form>
</body>
</html>
9.new.jsp(对修改页表单提交过来的数据进行验证)
<%@page import="com.kaishengit.util.StringUtil"%>
<%@page import="com.kaishengit.entity.Prod"%>
<%@page import="com.kaishengit.dao.ProdDao"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String prodName = request.getParameter("prodName");
String price = request.getParameter("price");
if(StringUtil.isEmpty(prodName) || StringUtil.isEmpty(price)){
response.sendRedirect("add.jsp?code=10001");
return; //这里一定要加return,因为jsp中即使跳转了本页的代码还是会一直执行下去,如果不强行阻止的话后面就会出现问题了,
}
try{
Prod prod = new Prod();
prod.setId(Integer.valueOf(id));
prod.setProdName(prodName);
prod.setPrice(Float.valueOf(price));
ProdDao pd = new ProdDao();
pd.update(prod);
response.sendRedirect("home.jsp");
} catch(NumberFormatException e){
response.sendRedirect("add.jsp?code=10002");
}
%>
10.home.jsp(中介过渡页)
<%@page import="com.kaishengit.dao.ProdDao"%>
<%@page import="com.kaishengit.entity.Prod"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="validate.jsp" %> <%--这个指令是用来引用外部的页面的,引用之后,编译的时候会将两个页面一起编译 --%>
<%
//创建这个home.jsp页面的原因就在于,因为每次在添加,删除,修改商品内容之后,都得用查找的形式,来使显示的内容能够是最新的,如果放在添加,删除,修改的页面来每次都写一次这个代码的话,则因为这三种页面都是由表单提交过来的,这样的话,又因为我们是请求转发式跳转,就会造成表单重复提交的问题,添加的会添加多次,修改的也会修改多次,所以做一个中介页面,在增删改页面重定向到home.jsp,这样,每次刷新的都是home.jsp,这个页面只是查询的操作,从而避免表单重复提交的问题
request.setCharacterEncoding("UTF-8");
ProdDao pd = new ProdDao();
List<Prod> prodList = pd.findAll();
request.setAttribute("prodList", prodList);
RequestDispatcher rd = request.getRequestDispatcher("main.jsp"); //将本页面所得到List集合传到main.jsp页面中进行显示,(注意:能传值的只有请求转发式跳转)
rd.forward(request, response);
%>
11.validate.jsp(主要是用来验证用户是否是经过登陆过来的,如果是,服务器会给一个sessionID,)
<%@page import="com.kaishengit.entity.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--这个页面主要是用来做验证的,只要没经过登陆而是直接敲某个具体的页面进来的,由于没有session.所以服务器会拒绝,这样的话就避免某些人直接敲页面进来的问题 --%>
<%
User user = (User)session.getAttribute("user"); //获取从服务器得到的sessionID是否存在
if(user == null){
response.sendRedirect("index.jsp?code=10004");
return; //跳转之后一定得记着写上return,不然还是会执行本页面后面的语句的!如果这里不写return的话,就会出现IllegalStateException
}
%>
java部分呢,
1.主要就是商品的Dao写的比较多:
package com.kaishengit.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import com.kaishengit.entity.Prod;
import com.kaishengit.util.DBHelp;
import com.kaishengit.util.RowMapper;
public class ProdDao {
DBHelp<Prod> db = new DBHelp<Prod>();
public List<Prod> findAll(){
String sql = "SELECT id,prodName,price FROM t_prod";
return db.executeQueryForList(sql, new ProdRowMapper());
}
public boolean add(String prodName,float price){
String sql = "INSERT INTO t_prod(prodName,price) VALUES(?,?)";
return db.executeSQL(sql, prodName,price);
}
public boolean del(int id){
String sql = "DELETE FROM t_prod WHERE id = ?";
return db.executeSQL(sql, id);
}
public Prod findById(int id){
String sql = "SELECT id,prodName,price FROM t_prod WHERE id = ?";
return db.executeQueryForObject(sql, new ProdRowMapper(), id);
}
public boolean update(Prod prod){
String sql = "UPDATE t_prod SET prodName = ?,price = ? WHERE id = ?";
return db.executeSQL(sql, prod.getProdName(),prod.getPrice(),prod.getId());
}
private class ProdRowMapper implements RowMapper<Prod>{
public Prod mapRow(ResultSet rs) throws SQLException {
Prod prod = new Prod();
prod.setId(rs.getInt("id"));
prod.setProdName(rs.getString("prodName"));
prod.setPrice(rs.getFloat("price"));
return prod;
}
}
}
2.除了DBHelp和RowMapper工具类之外,又多写了一个StringUtil类:
package com.kaishengit.util;
public class StringUtil {
public static boolean isEmpty(String str){ //设置成为静态方法则等一下在调用的时候直接用类名来调用即可
return str == null || "".equals(str);
}
}