当前位置:文档之家› 山东大学-中间件实验报告

山东大学-中间件实验报告

山东大学软件学院中间件技术课程实验报告onResize();},error : function(e) {alert('初始化数据错误!');}});});并从bootstrap上找一些已经写好的布局,作为参考。

加入到网页的界面中。

一、数据库操作的封装1、AutoCreateDB——自动创建数据库(1)可以根据下列query的结果判断数据库是否存在:Object obj = dao.QueryOnly("SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=?",new Object[] { DATABASE });不存在则创建数据库,则执行executeCreate方法。

(2)AutoCreateDB自动创建数据库的表遍历表,对于数据库中的每一个表,都执行“检测、若不存在则创建”操作,可以根据该query的结果判断数据库的表是否存在,不存在则创建数据库表,则执行executeCreate方法。

2、JdbcDao数据库相关操作(1)在JdbcDao 中定义应用与数据库建立连接,其相关参数从config.properties中获取:/**获取Connection连接*/public Connection getConnection(){Connection conn = null;System.out.println(JDBC_URL);System.out.println(USER_NAME);System.out.println(USER_PWD);try {conn = DriverManager.getConnection(JDBC_URL,USER_NAME,USER_PWD);} catch (SQLException e) {e.printStackTrace();}return conn;}(2)在JdbcDao 中定义关闭所有连接的方法/**关闭所有连接*/public void closeAll(Connection conn, Statement ps, ResultSet rs){try {if(rs!=null) rs.close();} catch (SQLException e) { e.printStackTrace(); }try {if(ps!=null) ps.close();} catch (SQLException e) { e.printStackTrace(); }try {if(conn!=null) conn.close();} catch (SQLException e) { e.printStackTrace(); }}(3)在JdbcDao 中定义增删改查的方法在JdbcDao 中定义执行update的方法(delete则status=0)public int executeUpdate(String sql, Object[] obj)在JdbcDao 中定义执行insert的方法public int executeInsert(String sql, Object[] obj)在JdbcDao 中定义执行query(返回多条记录)的方法public List<Map<String, Object>> Query(final String sql,Object []obj)在JdbcDao 中定义执行query(返回单条记录)的方法public Object QueryOnly(final String sql,Object []obj)3、JoinSql, Relatio, Where构建SQL语使得无需自己写原生的SQL,自己写SQL则比较容易出错.比如,当程序开始时检测并初始化数据库和表时输出的数据库语句如下:二、处理模块以及控制模块1、本框架使用流程:首先是一个control,类的命名方式xxx+Veasion请求url,/项目名/test/method.veatest:类名除Veasion之外的字符串,小写method:将被调用的方法名,或注解@Veasion(value=""),值不包含/ method定义:返回String,表示跳转的url或页面,默认转发,重定向请加“redirect:”或方法注解@Veasion(redirect=true).返回除String之外的Object,返回该对象的json.类中可以添加属性HttpServletRequest获取请求对象.类中可以添加属性HttpServletResponse获取响应对象.类中可以添加属性JSONObject获取分装的数据.2、在VeasionServlet的service方法中的uri预处理字符串处理uri,得到className和methodNameString[] classMethod = getClassMethod(vea);System.out.println("===");for(int i=0;i>classMethod.length;i++){System.out.println(classMethod[i]);}String className = classMethod[0];String methodName = classMethod[1];vea= classMethod[2];比如处理一下uri的过程如下:uri:/Veasion/admin/desktop/iconSearch.veavea:/admin/desktop/iconSearch.veaclassName:veasion.control.admin.DesktopVeasionmethodName:IconSearchvea_:admin/desktop/iconSearch3、Java的反射机制简介(1)Java的反射机制简介及举例:Java语言允许通过程序化的方式间接对Class的对象实例操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:构造函数、属性和方法等。

Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能.例:public Class Car{private String brand;private String color;private int maxSpeed;public Car(){}public Car(String brand,String color,int maxSpeed){this.brand = brand;this.color = color;this.maxSpeed = maxSpeed;}public void introduce(){System.out.println("brand"+brand+",color"+color+",+maxSpeed"+maxSpeed);}}import ng.reflect.Construcor;import ng.reflect.Field;import ng.reflect.Method;public class ReflectTest{public static Car initByDefaultConst() throws Throwable{//通过类加载器获取Car类对象ClassLoader loader = Thread.currentThread().getContextClassLoader();Class clazz = loader.loadClass(Car)://获取类的默认构造器对象并通过它实例化CarConstructor cons = clazz.getDeclardConstructor((Class[])null);Car car = (Car)cons.newInstance()://通过反射方法设置属性Method setBrand = clazz.getMethod("setBrand",String.class);setBrand.invoke(car,"WCA72");Method setColor = clazz.getMethod("setColor ",String.class);setColor .invoke(car,"black");Method setMaxSpeed = clazz.getMethod("setMaxSpeed ",int.class);setMaxSpeed .invoke(car,200);return car;}public static void main(String[] args) throws Throwable{Car car = initByDefaultConst();car.introduce();}}(2)所用到的相关方法和类简介Field:类的成员变量的反射类,通过Class#getDeclaredFields()方法可以获取类的成员变量反射对象数组,通过Class#getDeclaredFields(String name)则可获取某个特定名称的成员变量反射对象。

Field类最主要的方法是set(Object obj,Object value),obj表示操作目标评对象,通过value为目标对象的成员变量设置值。

若成员变为为基础类型,用户可以使用Field类中提供的带类型名的值设置方法。

Method:类方法的反射类,通过Class#getDeclaredMehtods()方法可以获取类的所有方法反射类对象数组Method[]。

在JDK 5.0中可以通过getDeclaredMehtods(String name,Class parameterTypes)获取特定签名的方法,name为方法名;Class为方法入参类型列表。

Method最主要的方法是invoke(Object obj,Object[] args),obj表示操作的目标对象,args为方法入参。

3、采用反射机制找到对应调用的方法Class c = null;// 反射找到对应control.veasiontry {c = Class.forName(className);Object obj = c.newInstance();//反射属性request,response和json数据this.reflectAttribute(request, response, c, obj);// 反射对应类的对应方法Method[] methods = c.getMethods();boolean success = false;for (int i = 0; i < methods.length; i++) {Method method = methods[i];String fName=method.getName().toLowerCase().trim();boolean isRedirect=false;Veasion v=method.getAnnotation(Veasion.class);//注解方法判断success=this.annotationVeasion(v,methodName,isRedirect);if(success){isRedirect=v.redirect();}//普通方法判断if (!success && fName.equalsIgnoreCase(methodName)) {success=true;}if(success){// 调用对应方法Object returnObj = method.invoke(obj);//封装响应数据并跳转success=dispatcher(request, response, vea, returnObj, isRedirect);if(success)break;}}if (!success) {response.sendError(404);}} catch (Exception e) {response.sendError(500);e.printStackTrace();}三、样例程序运行1、程序入口启动服务器之后默认跳转到index.jsp整个应用的入口是http://localhost:8080/Veasion/index/index.vea根据(二)中将的映射机制,该地址被处理处className和methodName 对应的Controller 是IndexVeasion ,采用的动作是index()2、进入界面管理界面在桌面上的记事本中输入暗码,并回车:通过code验证之后,进入到管理界面:此块操作对应的DeskVeasion。

相关主题