开发基于JSPServletJavaBean的网上交易系统

上传人:沈*** 文档编号:41635872 上传时间:2021-11-22 格式:DOC 页数:23 大小:250.50KB
返回 下载 相关 举报
开发基于JSPServletJavaBean的网上交易系统_第1页
第1页 / 共23页
开发基于JSPServletJavaBean的网上交易系统_第2页
第2页 / 共23页
开发基于JSPServletJavaBean的网上交易系统_第3页
第3页 / 共23页
点击查看更多>>
资源描述
开发基于JSP Servlet JavaBean的网上交易系统第一章 JavaEE的概述1 了解性知识(jsp的弊端,什么是JavaEE,什么是框架,javaEE的结构体系) 表示层技术(HTML JavaScript Ajax) 中间层技术(JSP Servlet JSTL JavaBean Strusts) 数据库技术(JDBC技术 数据层框架技术Hibernate) 系统集成技术(JAX-WS技术 JNDI)2 HTTP协议 http是一个无状态协议,默认输出端口为803 Post与Get提交数据方法的差别(Get方法是浏览器默认的提交方法) (1)Post请求数组在地址栏不可见,相对比较安全 (2)Post请求提交的数据在理论上没有长度的限制 (3)Get请求将字符串添加到URL中,是页面可以被设置成书签或使用电子邮件发送,Post请求则不能4 为Eclipse添加数据监控工具TCP/IP Monitor进行数据监控(1)单击“窗口”-“首选项”命令,弹出“首选项”窗口(2)展开左侧的“运行/调试”节点,选择TCP/IP Monitor选项,并选中Show the.复选框(3)添加监视窗口,单击add按钮后,弹出对话框,按图添加内容(4)启动监控,运行程序,把地址内的端口号8080改为8088查看监控结果第二章 Servlet基础1 Servlet是一个java程序,是在服务器端运行以处理客户端请求并作出响应的程序。创建Servlet类必须继承HttpServlet类,实现doGet()或者doPost()方法2 单击右建选择新建Servlet命令,在弹出的窗口中输入Servlet名称,选择超类为javax.servlet.http.HttpServlet,并选中Create doGet和doPost两个复选框,单击完成按钮3 Servlet的生命周期(1)实例化 Servlet容器创建Servlet的实例(2)初始化 该容器调用Init()方法(3)服务 如果请求Servlet,则容器调用service()方法(4)销毁 销毁实例之前调用destory()方法4 Servlet的部署与配置:web文件 AddServletservlet.AddServlet AddServlet /AddServlet 5 Servlet处理Get/Post请求(1)HttpServletRequest request对象常用方法 Request.getParameter(“param”)获取客户请求的数据 Request.setCharacterEncoding(“GBK”);将输入内容转化成中文 Request.setAttribute(“loginname”,user);在request作用域存储数据(2)HttpServletResponse response对象常用方法 Response.setContentType(“text/html;charset=GBK”);设置输出中文,解决中文乱码问题 Response.sendRedirect(“URL”);让浏览器重定向到指定的资源(3)转发 RequestDispatcher dispatcher=request.getRequestDispatcher(url);首选定义转发器dispatcher.forward(request, response); 然后实现转发的功能第三章 基于Servlet的会话跟踪(一) 1 会话的创建 HttpSession session = request.getSession(Boolean value);HttpSession session = request.getSession();在第一种方法中,布尔值为true时,如果存在与当前请求关联的会话,就返回该会话。否则创建一个新会话,并把会话返回。布尔值为false时,如果存在与当前请求关联的会话,就返回该会话。否则返回null,不创建会话。 2 会话的使用 Session.setAttribute(String name,Object value); Session.getAttribute(String name); 值得注意的是:Session.getAttribute(String name);方法返回的是Object对象,所以在取出数据是需要进行数据类型转化,是与存入的一致。 3 HttpSession对象的结束 (1)关闭浏览器,关闭Session (2)调用HttpSession的invalidate()方法,删除HttpSession对象和数据。 (3)两次访问的时间间隔大于Session定义的非活动时间间隔第四章 基于Servlet的会话跟踪(二)1 购物车的设计分析HttpSession session = request.getSession(false);RequestDispatcher dispatcher;/ 如果session不存在,转向 /ch04/books.jspif (session = null) dispatcher = request.getRequestDispatcher(/cho4/books.jsp);dispatcher.forward(request, response);/ 取出购物车和添加的书籍Map cart = (Map)session.getAttribute(cart);BookBean book = (BookBean) session.getAttribute(bookToAdd);/ 如果购物车不存在,创建购物车if (cart = null) cart = new HashMap();/ 将购物车存入session之中session.setAttribute(cart, cart);/ 判断书籍是否在购物车中CartItemBean cartItem = (CartItemBean) cart.get(book.getISBN();/ 如果书籍在购物车中,更新其数量./ 否则,创建一个条目到Map中.if (cartItem != null)cartItem.setQuantity(cartItem.getQuantity() + 1);elsecart.put(book.getISBN(), new CartItemBean(book, 1);/ 转向viewCart.jsp显示购物车response.sendRedirect(/Y2JavaEE/cho4/viewCart.jsp); 实现购物车列表 % Map cart = (Map) session.getAttribute(cart);double total = 0;if (cart = null | cart.size() = 0)out.println(购物车当前为空。);out.println(继续购物 ); else / 创建用于显示内容的变量Set cartItems = cart.keySet();Object isbn = cartItems.toArray();BookBean book;CartItemBean cartItem;int quantity;double price, subtotal;% / continue scriptlet int i = 0;while (i 我们通过Map接口的keySet()方法,可以把Map中的key建以set形式返回,在通过toArray()方法,将Set对象转换为Object类型数组,之后我们遍历数组,以数组元素为key值,取出map中所存储的数据 2 格式化问题 在处理数字格式方面,Java API为我们提供了DecimalFormat类,为我们解决十进制数字的格式化问题。 3 常用集合类,接口 (1)List接口(List接口与Set接口都继承自Collection接口) ArrayList是以Array方式实现的List,允许快速随机存取,相对与LinkedList不适合进行插入和移除元素操作 LinkedList提供最佳顺序存取,适合插入和移除元素(2)Set接口(set是一种不包含重复元素的Collection,也就是说在Set中最多只能有一个null元素) HashSet能够快速定位一个元素,但是它要存入HashSet的对象必须实现HashCode()方法 TreeSet将放入其中的元素按顺序存取(3)Map接口(Map是一种把键对象与值对象进行关联的容器,像Set一样,一个map容器中的键对象不允许重复,这是保证查找结果的一致性) HashMap类是Map类的实现类,实现一个键到值映射的哈希表,通过键取得值对象。 Properties类一般是把属性文件读入流中后,以键-值的形式进行保存,以方便程序员读取其中的数据第五章 基于Servlet的MVC设计模式 MVC是一种流行的软件设计模式 (1)模型(Modle):对应的组件是JavaBean(Java类)(2)视图(View):对应的组件是JSP或HTML文件(3)控制器(Controller):对应的组件是ServletMVC设计模式的好处1各司其职,互不干涉2有利于开发中的分工3有利于组建的重用第六章 Model层开发:高级JDBC 1 数据库连池 (1)数据连接池 在JDBC 2.0 中提供了javax.sql.DateSoure(数据源)接口,它负责建立与数据库的连接,在应用程序中访问数据据库不必编写连接数据库的代码,可直接从数据源获得数据库连接。 数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术明显的提高了对数据库的操作性能。 数据库连接池在初始时将创建一定的数据库连接放到连接池中,这些数据库连接的数量是有最小数据库连接数来确定的。无论这些数据库连接是否被使用,连接都一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个链接池能占用的最大连接数量,当应用程序向连接池请求的连接数量超过最大连接数量时,这些请求将被加入到等待列中。 (2)数据源与JNDI资源 DataSoure对象是由Web容器(Tomcat)提供的,因此不能在程序中采用创建一个实例的方法来生成DataSource对象,而需要采用Java的另一个技术JNDI,来获得DataSource对象 可以简单的把JNDI理解为一种将对象和名字绑定的技术,容器产生出对象,这些对象都和唯一的名字绑定。外部程序可以通过名字来访问该对象。 Javax.naming,Context提供了查找JNDI Resource的接口,例如,可以通过以下的代码获得jdbc/books的数据源的引用:Context ic = new InitialContext();DataSource source = (DataSource)ic.lookup(java:comp/env/jdbc/books);conn=source.getConnection(); /获取数据库连接当程序结束数据库访问后,应该调用Connection的close()方法,及时将Connection返回给数据库连接,是Connection恢复空闲状态。Context接口的lookup()方法方法说明lookup(String name)返回与指定的名字绑定的对象Tomcat把DataSource作为一种可配置的JNDI资源来处理。生成DataSource对象的工厂为mons.dbcp.BasicDataSourceFactory.配置多个DataSource,可以通过lookup(String name)自动查找连接。 (3)JNDI的配置 context.xml文件的配置 在Tomcat根目录confcontext.xml文件中节点中添加信息,内容添加如下:的属性属性说明Name指定Resource的JNDI名字Auth指定管理Resource的Manager,他有两个值可选:Container和Application.Container表示有容器来创建Resource,Application表示有Web来创建和管理ResourceType指定Resource所属的Java类名maxActive指定数据库连接池中的数据库连接处于活动状态的最大数目,取值为0表示不受限制maxIdle指定数据库连接池中的数据库连接处于空闲状态的最大数目,取值为0表示不受限制maxWait指定数据库连接池中的数据库连接处于空闲状态的最长时间(以毫秒为单位),超出这一时间会抛出异常。取值为-1可以无限制等待Username制定连接数据库的用户名Password指定连接数据库的口令driverClassName指定连接数据库的JDBC驱动程序url指定连接数据库的URlweb.xml文件的配置 E-Books DataSource jdbc/books javax.sql.DataSource Container的属性属性说明description对所引用资源的说明res-ref-name指定所引用资源的JNDI名字,与元素中的name属性对应res-type指定所引用资源的类名字,与元素中的type属性对应res-auth指定管理所引用资源的Manager,与元素中的auth属性对应3 基于数据库文件的数据库配置(1)数据配置信息private static final String DRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver;private static final String DATABASE_URL=jdbc:sqlserver:/localhost:1433;databaseName=news;private static final String DRIVER_USER=hafei;private static final String DRIVER_PASSWORD=513810;(2)属性文件driver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver:/localhost:1433;databaseName=ownHomeuser=hafeipassword=513810在Java中提供了Properties类,来读取.properties(属性)文件。在程序调用Properties类的load()方法时,系统把db.properties文件的内容加载到内存中。因为Properties继承类Hashtable, Properties类把“=”之前的内容添加到Hashtable对象的key值,并同时添加key值对应的value.所以在编写.properties文件时一定要使用=号把名称与值分隔开(3)读取属性文件import java.io.InputStream;import java.util.Properties;public class ProReader extends Properties/定义静态对象private static ProReader instance;/* * 公有的获取实例的方法 * return Env 实例 */public static ProReader getInstance() if (instance != null) return instance; else makeInstance();return instance;/* * 同步的创建实例方法 * */private static synchronized void makeInstance() if (instance = null) instance = new ProReader();/* * 私有的构造方法,确保实例的唯一性 * */private ProReader() InputStream is = (InputStream) getClass().getResourceAsStream(/common/dbInfo.properties);try load(is); catch (Exception e) System.err.println(错误:没有读取属性文件,请确认db.property文件是否存在。);return;读取配置信息String driverClassName = ProReader.getInstance().getProperty(driver);String url = ProReader.getInstance().getProperty(url);String user = ProReader.getInstance().getProperty(user);String password = ProReader.getInstance().getProperty(password);在读取配置信息时,使用单列模型创建,获得对象实例,并调用Properties类提供的方法getProperty(“key”)方法获得HashTable的value值,进行创建数据库连接类的操作。4 Class与Object小结(1)Class类 Class.forName(String className):该方法生成以一个String类型参数指定的classname的class对象,如Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); InputStrean getResourceAsStream(String name):该方法是打开并读取一个String类型参数指定的文件到系统内存中,以方便获得系统信息,如InputStream is = (InputStream) getClass().getResourceAsStream(/common/dbInfo.properties);Properties p = new Properties();P.Load(in);(2)Object类 Object类是所有类的根类,我们自定义的类都默认的继承于这个类,所以所有的类包括数组都具有这个类的方法。 getClass():返回一个对象的运行时类 toString():返回该对象的字符串表示,在Object类中是返回对象的地址信息 equals(Object obj):判断obj与当前对象是否相等。5 自定义异常(1)定义异常类public class DBAccessException extends Exception private static final long serialVersionUID = 1L;protected Throwable throwable;/* * 构造方法 * * param message */public DBAccessException(String message) super(message);/* * 构造方法 * * param message * param throwable */public DBAccessException(String message, Throwable throwable) super(message);this.throwable = throwable;/* * 返回底层异常原因 * * return Throwable */public Throwable getCause() return throwable;用户自定义异常类要继承Exception类,虽然Exception类中没有定义自己的任何方法,但从Throwable类继承了所有的方法。创建的用户自定义异常类都将具有Throwable类的所有方法。(2)使用自定义异常类/数据库连接public static synchronized Connection getConn() throws DBAccessException / 读出配置信息String driverClassName = Env.getInstance().getProperty(driver);String url = Env.getInstance().getProperty(url);String user = Env.getInstance().getProperty(user);String password = Env.getInstance().getProperty(password);Connection conn=null;try Class.forName(driverClassName); conn = DriverManager.getConnection(url,user,password);catch(Exception ex)throw new DBAccessException(不能获得数据库连接!);return conn;6通用的DAO类(1)通用的DAO类的实现package dao.impl;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.List;import javax.servlet.jsp.jstl.sql.Result;import javax.servlet.jsp.jstl.sql.ResultSupport;public class DBConnection private static final String DRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver;private static final String DATABASE_URL=jdbc:sqlserver:/localhost:1433;databaseName=e_pai;private static final String DRIVER_USER=hafei;private static final String DRIVER_PASSWORD=513810;private Connection conn;private String sqlvalue;private List values; /设定数据库连接public void setConn() throws ClassNotFoundException, SQLException Class.forName(DRIVER_CLASS); conn = DriverManager.getConnection(DATABASE_URL,DRIVER_USER,DRIVER_PASSWORD);/设定SQl语句public void setSqlvalue(String sqlvalue) this.sqlvalue = sqlvalue;/设定语句参数public void setValues(List values) this.values = values;/数据库连接public static Connection getConn() throws ClassNotFoundException,SQLException Class.forName(DRIVER_CLASS);Connection conn = DriverManager.getConnection(DATABASE_URL,DRIVER_USER,DRIVER_PASSWORD);return conn;/释放资源 一个方法关闭三个public static void closeAll(Connection conn,PreparedStatement pStatement,ResultSet res)tryif(res !=null)res.close();res=null;catch(SQLException ex)ex.printStackTrace();tryif(pStatement !=null)pStatement.close();pStatement=null;catch(SQLException ex)ex.printStackTrace();tryif(conn!=null &(!conn.isClosed()conn.close();catch(SQLException ex)ex.printStackTrace();/设定语句的参数private void setValues(PreparedStatement pstmt,List values)throws SQLException/循环将SQL语句参数列表中 的值一次付给执行语句for(int i=0;i0)/使用预处理语句,并设定所有的SQL语句的所有参数值pstmt=conn.prepareStatement(sqlvalue);setValues(pstmt,values);/执行查询返回查询结果集rs =pstmt.executeQuery();elsestmt=conn.createStatement();rs=stmt.executeQuery(sqlvalue);/将ResultSet转化为Resultresult=ResultSupport.toResult(rs);finallythis.closeAll(conn, pstmt, rs);return result;/执行sqL语句实现增删改但 不能执行查询public int executeUpdate() throws SQLException int noOfRows=0;PreparedStatement pstmt=null;Statement stmt =null;/*处理SQL执行SQL*/tryif(values!=null & values.size()0)/使用预处理语句,并设定所有的SQL语句的所有参数值pstmt=conn.prepareStatement(sqlvalue);setValues(pstmt,values);/执行更新语句,返回受影响的行数noOfRows =pstmt.executeUpdate();elsestmt=conn.createStatement();noOfRows=stmt.executeUpdate(sqlvalue);finallythis.closeAll(conn, pstmt, null);return noOfRows;(2)通用DAO类的使用public List search(Users condition) List list =new ArrayList();String sql= select * from users where 1=1;if(condition!=null)if(condition.getUserId()!=0)sql+=and userId=+condition.getUserId();if(condition.getUserName()!=null & !condition.getUserName().trim().equals()sql+=and userName like %+condition.getUserName()+%;try DBConnection dbConnection = new DBConnection();dbConnection.setConn();dbConnection.setSqlvalue(sql);Result result = dbConnection.executeQuery();if (result = null | result.getRowCount() = 0) / 没有查出BookSystem.out.println(没有用户!); else int rowCount = result.getRowCount();/ 读取行数据for (int i = 0; i rowCount; i+) Map row = result.getRows()i;Users item = new Users();item.setUserId(Integer) row.get(userId);item.setUserName(String) row.get(userName);item.setPassword(String) row.get(password);item.setUserCode(String) row.get(userCode);item.setUserTel(String) row.get(userTel);item.setUserAddr(String) row.get(userAddr);item.setUserZip(String) row.get(userZip);item.setUserStatus(Integer) row.get(userStatus);list.add(item); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return list;第七章 View层开发:JavaBean在Jsp中的使用 1 什么是JavaBean JavaBean实际上就是一个Java类,这个类可以重用。从javaBean的功能上可以分为两类 (1)封装数据(2)封装业务JavaBean一般情况下满足一下要求是一个公有类,并提供无参的公有的构造方法属性私有具有公有的访问属性的getter和setter方法2 JSP与JavaBean JSP标准动作在浏览器请求JSP页面时执行,JSP标准动作可使用现有的JavaBean组件和属性,以及用户请求转发到另一个页面 JSP标准动作使用作为前缀,JSP标准动作中的属性区分大小写,属性中的值必须至于双引号内。JSP标准的语法如下:其中,action_name是要执行的动作;attribute将被指定动作的属性所替换(1)(2)setProperty动作用于设置useBean中指定的JavaBean的属性值。SetProperty动作指定名,称属性,值和参数,用于赋给JavaBean的属性。name指定userBean中使用的JavaBean的id;property指定要获取JavaBean的属性名称,value指定要为属性设置值;param指定用于输入数据的表单元素名称,并给属性赋值(3)useBean中的Id所指定的对象通过setProperty中对property指定的属性进行赋值后,可以使用动作获取JavaBean中指定的属性值name指定userBean中使用的JavaBean的id;property指定要获取JavaBean的属性名称(4)Page属性指定欲跳转到的页面路径实例第八章 View层开发:EL和JSTL 1 EL语法 EL可以操作对象,数组,映射,还可以进行表达式的计算以及逻辑运算。 在EL中只能进行逻辑的运算,但是不能进行逻辑的控制。 $EL表达式 (1)点操作符 在使用EL时,EL表达式一般有两部分组成,如$teache.name,其中,“.”被称作点号操作符,在操作符的左边可以是一个JavaBean对象,也可以是EL隐式对象,点操作符的右面可以是一个JavaBean属性,也可以是一个映射键。(2)操作符 如果使用EL操作数据组,则使用点操作符就不能进行有效的操作,这时应该使用“”,如$list0.但这并不代表“”只能操作数组,点操作符能操作的对象,都可以使用“”来进行操作,如$teacher“name”,注意,使用“”操作符时,“”中应该含有“”2 JSTL标准标签库 (1)通用标签 :设置指定范围的变量值,如果该变量不存在,则创建它 其中,var指定变量的名称以存储value指定的值;value设置var指定的变量的值:acope指定变量的范围,只能为 page|request|session|application,默认为page:用于删除变量 其中,var指定要删除的变量的名称;acope指定变量的范围。:计算表达式并将结果显示在页面上其中,value指定表达式或变量(2)条件标签 /条件为true时,执行代码 其中,test指定条件,通常使用EL方式进行条件的运算:$条件运算,运算可以使用,=,也可以使用and,or,还可以使用lt,eq,gt等;var指定变量,并把EL运算结果付给变量。Scope指定范围。(3)迭代标签 /循环体内容其中,var指定变量的名称;items指定要遍历的对象集合,可以是数组,List和Map.实例3 EL隐式对象(1)作用域访问对象对象名称说明PageScope返回页面范围内的变量,这些名称已映射至相应的值requestScope返回请求范围内的变量,这些名称已映射至相应的值sessionScope返回会话范围内的变量,这些名称已映射至相应的值applicationScope返回应用范围内的变量,并将变量名映射至相应的值如果在获取变量值时,不使用作用域访问对象,系统会按照page|request|session|application的顺序来查找(2)参数访问对象对象名说明param返回客户端的请求参数的字符串值paramValues返回映射至客户端的请求参数的一组值(3)JSP隐式对象 JSP和EL有一个公共对象,pageContext,具体的说明见表。EL可以通过pageContext来访问JSP中其他的隐式对象(request,session)如$pageContext.request.requestURI对象名说明pageContext提供对用户请求和页面信息的访问4 SQL标签(1)使用SQL标签修改数据库中的信息sql:setDataSource driver=com.microsoft.sqlserve
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!