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);
    }
}

 

posted on 2012-07-11 21:45  dongzhouzhou  阅读(1068)  评论(0编辑  收藏  举报