学生信息管理系统——Spring框架.ppt
学生信息管理系统学生信息管理系统Spring框架应用框架应用1 Spring工作流程工作流程2 新建新建Spring项目项目3 Spring配置文件配置文件4 Tiles框架配置文件框架配置文件5 系统登录系统登录6 学生信息管理学生信息管理1 Spring工作流程工作流程在进行Spring项目实践之前,我们先来回忆一下第8章Spring应用的内容,在这里对Spring应用的工作流程进行一下简单的梳理。如图13-1所示:图13-1Spring工作流程2 新建新建Spring项目项目本项目实践中,使用Spring+JDBC来开发Web应用程序。新建Web应用项目,添加Spring开发能力。设置Web应用的MVC结构,如图13-2所示。图13-2 Spring Web应用程序结构3 Spring配置文件配置文件Spring配置文件,如图13-3所示。图13-3Spring配置文件3.1 核心配置文件核心配置文件Spring的核心配置文件是根据Web.xml中设置的servlet的名字来设定的。例如servlet的名字设置为spring,则Spring的核心配置文件默认为WEB-INFspring-servlet.xml。例如以下servlet设置:springorg.springframework.Web.servlet.DispatcherServlet1spring*.student3.1 核心配置文件核心配置文件当然,为了程序设计结构的清晰,我们设置多个spring配置文件(.xml),分别设置Spring的DAO层、Service层等,然后在Web.xml中进行加载,如本项目实践中,通过以下设置实现自定义文件student-data.xml,student-service.xml加载。contextConfigLocation/WEB-INF/student-data.xml,/WEB-INF/student-service.xmlorg.springframework.Web.context.ContextLoaderListener3.1 核心配置文件核心配置文件由于在向数据库插入信息时,有可能出现乱码,以前在Struts中的处理方法是自己定义过滤器,而Spring容器中自带了过滤器,所以这里只要在Web.xml文件中配置以下代码即可。encodingFilterorg.springframework.Web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrueencodingFilter/*3.1 核心配置文件核心配置文件我们使用spring-config.properties文件来存储数据库连接参数信息,如果数据库的配置有变化,只需要修改此文件即可,内容如下。connection.url=jdbc:sqlserver:/localhost:1433;DatabaseName=XSCJconnection.driverclassname=com.microsoft.sqlserver.jdbc.SQLServerDriverconnection.username=xscjconnection.password=achievement需要在配置文件student-data.xml中,设置如下内容,加载spring-config.properties文件。/WEB-INF/spring-config.properties3.1 核心配置文件核心配置文件现在设置数据源,配置student-data.xml文件,内容如下所示。$connection.url$connection.driverclassname$connection.username$connection.password3.2 Spring标签库标签库v1spring:hasBindErrorsspring:hasBindErrors对应org.springframework.Web.servlet.tags.BindErrorsTag标记库处理类。这个标记提供用于绑定对象的errors,如果这个标记绑定的对象不符合要求,那么关于这个绑定对象的错误将在页面上显示出来。使用这个标记的前提条件是要先使用标记,并且要注意,这个标记不能用来表示对象的状态,它仅仅可以绑定对象本身和对象的属性。具体用法如下。Pleasefixallerrors!标记的name属性是必须要的,是要被检查的Bean的名字。3.2 Spring标签库标签库v2spring:bindspring:bind对应org.springframework.Web.servlet.tags.BindTag标记库处理类。这个标记用来与某个bean或bean的属性绑定,通常和form一起用,相当于action的作用。它指明表单要提交到那个类或类的属性中去。其中path属性是必需的,指明转到的类的路径。举例如下。inputtype=textname=dlmvalue=class=txt/3.2 Spring标签标签v3spring:transformspring:transform对应org.springframework.Web.servlet.tags.TransformTag标记库处理类。这个标记用来转换表单中不与bean中的属性一一对应的那些属性,通常和一起使用。标记为使用提供了更好的支持。spring:transform标签具有如下属性:value:必需的。和当前标记指向的bean类相同。就是要转换的实体类名。var:不是必需的。这个字符串被用来绑定输出结果到page,request,session或applicationscope。默认情况输出到jsp中。scope:不是必需的。前提条件var必须设置的情况下。它的值可以是page,request,session或application。3.2 Spring标签标签v4spring:messagespring:message对应org.springframework.Web.servlet.tags.MessageTag标记库处理类。这个标记用来帮助springframework支持国际化。和JSTL的fmt:message标记类似。当然这个标记可以很好地工作在本地的springframework框架下。spring:message标签具有如下属性:code:不是必需的。用来查找message,如果没有被使用的话,text将被使用。text:不是必需的。假如code不存在的话,默认是text输出。当code和text都没有设置的话,标记将输出为null。var:不是必需的。这个字符串被用来绑定输出结果到page,request,session或applicationscope。默认情况输出到jsp中。scope:不是必需的。前提条件var必须设置的情况下。它的值可以是page,request,session或application。3.2 Spring标签标签v5spring:htmlEscapespring:htmlEscape对应org.springframework.Web.servlet.tags.HtmlEscapeTag标记库处理类。该标签不常用,在这里不介绍。v6spring:themespring:theme对应org.springframework.Web.servlet.tags.ThemeTag标记库处理类。该标签不常用,在这里不介绍。4 Tiles框架配置文件框架配置文件Tiles有一个配置文件:tiles-defs.xml。位于WEB-INF目录下。Tiles框架配置文件还需要struts-tiles.tld文件及commons-beanutils.jar和commons-digester.jar的支持,读者可以自行下载。tiles-defs.xml定义了每一个页面的组成元素和形式。例如以下在tiles-defs.xml中的定义。4 Tiles框架配置文件框架配置文件mainTemplate.jsp页面内容如下所示。4 Tiles框架配置文件框架配置文件用户需要在spring-servlet.xml配置文件中设置如下内容加载Tiles框架文件。/WEB-INF/tiles-defs.xml同时还要将视图解析设置为tiles视图解析,如下所示。org.springframework.Web.servlet.view.tiles.TilesView5 系统登录系统登录在编写代码之前,先来看看要达到的效果。登录界面如图13-4所示。登录成功后回到主界面,如图13-5所示。图13-4登录界面图13-5主界面5.1 POJO类类在包com.springproj.model中,新建用户POJO类User.java,代码如下。packagecom.springproj.model;publicclassUserprivateStringdlm;privateStringkl;privateStringrole;publicStringgetDlm()returndlm;publicvoidsetDlm(Stringdlm)this.dlm=dlm;publicStringgetKl()returnkl;publicvoidsetKl(Stringkl)this.kl=kl;publicStringgetRole()returnrole;publicvoidsetRole(Stringrole)this.role=role;5.2 继承继承MappingSqlQuery类实现查询类实现查询封装封装新建一个抽象类FindUser.java,该类继承MappingSqlQuery类。定义好了抽象类,怎么传递SQL语句呢?下面我们来看看如何实现FindUser类。新建FindUserByDlmExceptAdmins.java继承FindUser类,该类用来实现检索XSCJUSER表中的学生登录信息。在构造方法中,我们看到了SQL语句,而构造方法本身只接收DataSource参数。我们可以根据自己的需要,创建FindUser的子类,来实现检索功能。如获得学生登录信息。下面,我们来创建检索XSCJUSER表中的管理员登录信息的查询类。5.3 DAO Interface与与DAO实现类实现类在包com.springproj.dao中,新建用户DAO接口UserDao.java,代码如下。packagecom.springproj.dao;importjava.util.List;importcom.springproj.model.User;publicinterfaceUserDao/根据登录名取得用户信息(只有管理员)publicUsergetUserByDlmExceptStudents(Stringdlm);/根据登录名取得用户信息(只有学生)publicUsergetUserByDlmExceptAdmins(Stringdlm);5.3 DAO Interface与与DAO实现类实现类在包com.springproj.dao.jdbc中,新建用户DAO接口实现类UserDaoJdbc.java,代码如下。packagecom.springproj.dao.jdbc;importorg.springframework.jdbc.core.support.JdbcDaoSupport;importcom.springproj.dao.UserDao;importcom.springproj.dao.jdbc.rdbms.search.FindUserByDlmExceptAdmins;importcom.springproj.dao.jdbc.rdbms.search.FindUserByDlmExceptStudents;importcom.springproj.model.User;publicclassUserDaoJdbcextendsJdbcDaoSupportimplementsUserDao/根据登录名获得管理员用户对象publicUsergetUserByDlmExceptStudents(Stringdlm)/使用了FindUserByDlmExceptStudents查询类returnnewFindUserByDlmExceptStudents(getDataSource().findUser(dlm);/根据登录名获得学生用户对象publicUsergetUserByDlmExceptAdmins(Stringdlm)/使用了FindUserByDlmExceptAdmins查询类returnnewFindUserByDlmExceptAdmins(getDataSource().findUser(dlm);5.4 Service Interface与与Service实现类实现类Service接口内容与DAO接口内容相似。在包com.springproj.service中新建UserService接口,代码如下。packagecom.springproj.service;importjava.util.List;importcom.springproj.model.User;publicinterfaceUserService/根据登录名取得用户信息(管理员用户)publicUsergetUserByDlmExceptStudents(Stringdlm);/根据登录名取得用户信息(学生用户)publicUsergetUserByDlmExceptAdmins(Stringdlm);在包com.springproj.service.impl中新建UserServiceImpl.java实现UserService接口。5.5 MVC Controller设计设计下面我们来设计系统登录Controller。在com.springproj.mvc包中,新建LoginController类,因为登录中需要提交表单,所以继承SimpleFormController类,它可以更好地处理表单。5.6 Validator验证器验证器在页面表单中填写数据时,可能存在某种输入的格式,例如E-mail或者电话号码等字段,提交表单之前我们就需要对其进行验证,判断输入格式是否正确或者不能为空等,如果全部符合,才能进行提交的动作。这时,就需要Validator验证器的支持。在com.springproj.validator包中,我们新建一个类,名为UserValidator,使它继承org.springframework.validation.Validator类。5.7 Spring配置文件配置文件所有的类都已经设计好了,下面更新一下Spring的配置文件。首先,更新student-data.xml文件。配置数据库连接,首先要加载spring-config.properties文件,如下所示。/WEB-INF/spring-config.propertiesspring-config.properties文件来存储数据库连接参数信息,如果数据库的配置有变化,只需要修改此文件即可,内容如下。connection.url=jdbc:sqlserver:/localhost:1433;DatabaseName=XSCJconnection.driverclassname=com.microsoft.sqlserver.jdbc.SQLServerDriverconnection.username=xscjconnection.password=achievement13.5.7 Spring配置文件配置文件在student-data.xml文件中配置数据源。$connection.url$connection.driverclassname$connection.username$connection.password5.7 Spring配置文件配置文件设置userDaoBean:下面,我们来设置ServiceBean。打开student-service.xml,配置以下内容。接下来,我们来配置UserController。打开核心配置文件spring-servlet.xml,添加以下内容。5.7 Spring配置文件配置文件sessionForm:是否启用Session来存储Form,如果设置为true,表示启用了Session,则直接从Session中取出原表单对象,否则再次调用formBackingObject()方法构造出一个表单对象。sessionForm默认为false,启用Session可能提高运行性能,但会占用一定的内存。commandName:决定将在视图页面中活动的bean;commandClass:视图页面中活动bean对应的类;validator:装配校验器,引用另一个beanuserValidator;formView:设置表单输入视图;successView:设置表单验证成功后跳转的视图;requireSession:只有在Controller中需要使用Session时才需要设置为true,如果不需要,可以不设置此属性。配置好了Controller,下面配置视图映射。5.8 Tiles框架文件配置框架文件配置在loginController配置中,我们看到了formView属性值为loginForm,successView属性值为loginSuccess,读者可能会很迷惑,下面就来配置Tiles文件,添加如下内容。5.9 JSP页面页面在WebRoot中新建文件夹“manage”,在“manage”文件夹下新建“login.jsp”、“main.jsp”、“leftFrame.jsp”、“rightFrame.jsp”和“logout.jsp”。由于页面中需要引入图片文件和css样式设计,代码量相当大,而且由于没有图片资源,页面中用到图片的地方会出现空白区域,所以在此仅将重要的内容列上,其他的装饰性信息不在此给出,具体内容可到网站进行下载学习。编辑login.jsp页面,内容如下。5.9 JSP页面页面编辑mainTemplate.jsp页面。5.9 JSP页面页面编辑leftFrame.jsp页面,代码如下所示。desk.jsp内容如下。欢迎光临学生信息管理系统!index.jsp页面直接跳转到登陆页面,代码如下。MyJSPindex.jspstartingpage6 学生信息管理学生信息管理事务具有4个属性:原子性、一致性、隔离性、持续性。原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。一致性(consistency)。事务必须使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。持续性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。Spring提供编程式的事务管理(Programmatictransactionmanagement)与声明式的事务管理(Declarativetransactionmanagement)。编程式的事务管理,可以清楚地控制事务的边界,也就是让用户自行控制事务开始时间、撤销操作的时间、结束时间等,可以实现细粒度的事务控制。6.1 声明式的事务管理声明式的事务管理当管理员添加学生信息的时候,同时还要将该学生号添加进用户表中(学生也可以登录系统)。这时就涉及了对两张表的操作,需要事务的支持。本例中使用声明式的事务管理。在介绍开发思路及编写代码之前,先来看看添加学生信息要达到的效果。单击主界面左边的添加学生信息超链接,填写要添加学生信息,如图13-6所示。图13-6添加学生信息界面6.1 声明式的事务管理声明式的事务管理首先,我们先来看一下学生POJO类。因为在插入学生信息时,要验证输入的学号是否已经存在,所以在Dao中应该有这样的方法来根据学号查询学生信息,所以,这里建立学生的查询封装类,新建一个抽象类FindStudent.java,该类继承MappingSqlQuery类。具体代码如下。6.1 声明式的事务管理声明式的事务管理下面我们来看看如何实现FindStudent类。新建FindStudentByXh继承FindStudent类,该类用来实现根据学号检索XS表中的学生信息。代码如下。packagecom.springproj.dao.jdbc.rdbms.search;importjava.sql.Types;importjava.util.List;importjavax.sql.DataSource;importorg.springframework.jdbc.core.SqlParameter;importcom.springproj.model.Student;publicclassFindStudentByXhextendsFindStudentpublicFindStudentByXh(DataSourcedataSource)super(dataSource,SELECT*FROMXSWHEREXH=?);declareParameter(newSqlParameter(Types.VARCHAR);compile();publicStudentfindStudent(Stringxh)execute(xh);returnthis.student;6.1 声明式的事务管理声明式的事务管理准备工作完成以后就可以来编写DAO了。DAO接口内容如下。packagecom.springproj.dao;importjava.util.List;importcom.springproj.model.Student;publicinterfaceStudentDao/保存学生信息publicvoidsave(Studentstudent);publicStudentgetStudentByXh(Stringxh);DAO实现类StudentDaoJdbc.java中的save方法,内容如下。6.1 声明式的事务管理声明式的事务管理StudentTransferException是一个自定义异常类,代码如下。packagecom.springproj.dao.exception;importorg.springframework.dao.DataAccessException;publicclassStudentTransferExceptionextendsDataAccessExceptionprivatestaticfinallongserialVersionUID=1L;/自定义异常类publicStudentTransferException(Stringmsg)super(msg);Service接口内容如下。packagecom.springproj.service;importjava.util.List;importcom.springproj.model.Student;publicinterfaceStudentService/保存学生信息publicvoidsave(Studentstudent);/根据学号查询学生信息publicObjectgetStudentByXh(Stringxh);6.1 声明式的事务管理声明式的事务管理Service接口实现类,内容如下。packagecom.springproj.service.impl;importjava.util.List;importcom.springproj.dao.StudentDao;importcom.springproj.dao.exception.StudentTransferException;importcom.springproj.model.Student;importcom.springproj.service.StudentService;publicclassStudentServiceImplimplementsStudentService/定义StudentDao接口privateStudentDaostudentDao;/依赖注入StudentDao属性publicvoidsetStudentDao(StudentDaostudentDao)this.studentDao=studentDao;publicStudentServiceImpl()/save方法publicvoidsave(Studentstudent)throwsStudentTransferExceptionstudentDao.save(student);publicObjectgetStudentByXh(Stringxh)returnstudentDao.getStudentByXh(xh);6.1 声明式的事务管理声明式的事务管理在文件student-data.xml文件中配置studentDao,内容如下。加入事务管理的服务,一个简单的方法是使用TransactionProxyFactoryBean,指定要介入的事务管理对象及其方法,这需要在配置文件中进行定义,我们在student-service.xml文件中配置以下内容。接下来,编写Controller类StudentFormController,内容如下。下面,我们来配置spring-servlet.xml文件,内容如下。6.1 声明式的事务管理声明式的事务管理在urlMapping节点中加入映射。editStudentController在tiles-defs.xml文件中,配置添加学生信息页面。6.1 声明式的事务管理声明式的事务管理rightFrame.jsp页面内容如下。CopyRight©2008AllRightsReserved6.1 声明式的事务管理声明式的事务管理studentEdit.jsp页面内容如下。success.jsp页面内容如下。添加成功!6.2 照片上传照片上传通常情况下,Spring是不处理文件上传的,因为一些开发者想要自己处理它们。如果想使用Spring的这个功能,需要在Web应用的上下文中添加分段文件解析器。这样,每个请求就会被检查是否包含文件上传。如果没有,这个请求就被正常地处理,否则,应用上下文中已经定义的MultipartResolver就会被调用。然后,请求中的文件属性就会像其他属性一样被处理。在spring-servlet.xml中配置文件中定义如下MultipartResolver解析器。在JSP页面中使用文件上传,代码如下。6.2 照片上传照片上传在上面这个表单里有一个input元素,这个元素的名字(“zp”)和服务器端处理这个表单的bean中类型为byte的属性名相同。见Student.java中代码。packagecom.springproj.model;importjava.util.Date;importjava.util.List;publicclassStudentextendsUser/照片属性privatebytezp;publicbytegetZp()returnzp;publicvoidsetZp(bytezp)this.zp=zp;6.2 照片上传照片上传为了使用表单上传文件,需要声明一个解析器,一个控制器,再将文件上传的URL映射到控制器来处理这个请求。下面是这几个bean的声明。下面来看一下控制器中如何绑定byte,查看StudentFormController类的initBinder方法。protectedvoidinitBinder(HttpServletRequestrequest,ServletRequestDataBinderbinder)throwsException/字节数组格式绑定binder.registerCustomEditor(byte.class,newByteArrayMultipartFileEditor();6.3 捕获异常捕获异常设计捕获异常类,代码如下所示。别忘记,在配置文件中定义异常解析器接口。