Struts2开胃菜

<!--
	企业级三大框架SSH之一,Struts2的热身运动,今天只是个开场白!
-->
SSH相信对学Java开发的都不陌生,这三大框架使我们学Java的必经之路,
今天呢,只是Struts2框架的热身运动,开场白而已~呵呵~今天两个内容:
通用查询法和实现一个迷你struts

一.通用查询法
/*
*这个主要是采用反射机制来实现的!需要两个参数,sql语句和一个类
*/
public static ArrayList CommonQuery(String sql,Class cls){
		//一个集合来装东西
		ArrayList list=new ArrayList();
		PreparedStatement ps=null;
		ResultSet rs=null;
		//获取连接
		Connection conn=DBUtil.getConn();
		try {
			ps=conn.prepareStatement(sql);
			rs=ps.executeQuery();
			//java.lang.reflect-->Field
			//获取该类中的所有字段
			Field[] field=cls.getDeclaredFields();
			//获取元数据(用来描述数据的数据)
			ResultSetMetaData meta=rs.getMetaData();
			Object obj=null;
			while(rs.next()){
				//实例化一个对象
				obj=cls.newInstance();
				//循环对比看看各行各列的名字是否相同
				for(Field f : field){
					//设置其访问权限
					f.setAccessible(true);
					for(int i=1;i<=meta.getColumnCount();i++){
						//如果列名与字段名相同(忽略大小写)
						//这里要注意了!目前这个方法不是很完善~字段名必须和列名相同才行!!这个会有solution的!
						if(f.getName().equalsIgnoreCase(meta.getColumnName(i))){
							//如果是整形的
							if(meta.getColumnTypeName(i).equalsIgnoreCase("int")){
								f.setInt(obj,rs.getInt(meta.getColumnName(i)));
							}else if(meta.getColumnTypeName(i).equalsIgnoreCase("varchar")){//这里注意了哦,不是String哦
								f.set(obj, rs.getString(meta.getColumnName(i)));
							}
						}
					}
				}
				//最后别忘了添加到集合中哦
				list.add(obj);
			}
			
		//会抛出的异常!
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}finally{
			DBUtil.closeConn(rs, ps, conn);
		}
		return list;
}

这个方法写好后,然后我们在调用该方法那边的DAO类中该这样写!
public ArrayList getAll(){
		return DBUtil.CommonQuery("select * from StuInfo", StuInfo.class);
}

二,MiniStruts2(这个根本就是太MINI了~伤不起的种)但是这其中的思想很重要!
核心思想:在个人看来就是在不使用servlet的情况下访问类中的字段和方法!并且结合Filter一并使用,
前提是在表单提交的情况下!
大概流程:
1)在表单中action中的提交路径应该这样写:"类的路径_需要调用的方法名.过滤后缀"
eg:"com.shu.dao.MyString_splitIt.lsl"

2)首先建立一个过滤器:新建class implements Filter  (import javax.servlet.Filter) 并实现方法
	并在xml中写入要过滤的页面为:"*.过滤后缀" eg:"*.lsl"
	
3)在doFilter中写道:
		//获取过来的路径结构"com.shu.dao.NumberDao_calcIt.lsl"
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)rep;
		//System.out.println(request.getRequestURI());-->/MyCalculator/com.shu.dao.NumberDao_calcIt.lsl
		//System.out.println(request.getRequestURL());-->http://192.168.1.100:8080/MyCalculator/com.shu.dao.NumberDao_calcIt.lsl
		String userUri=request.getRequestURI();
		//去掉不需要的部分
		userUri=userUri.substring(userUri.lastIndexOf('/')+1);
		userUri=userUri.substring(0,userUri.lastIndexOf('.'));
		//分别获取类和方法
		String[] methods=userUri.split("_");
		try {
			//实例化该类
			Class cls=Class.forName(methods[0]);
			//利用反射创建对象
			try {
				Object obj=cls.newInstance();
				//获取该类的字段
				//java.lang.reflect
				Field[] fields=cls.getDeclaredFields();
				//获取该类中的方法
				Method[] meds=cls.getDeclaredMethods();
				for(Field fid : fields){
					fid.setAccessible(true);
					fid.setFloat(obj,Float.parseFloat(request.getParameter(fid.getName())));
				}
				for(Method met : meds){
					if(met.getName().equals(methods[1])){
						Object result=met.invoke(obj);
						if(result!=null){
							//注意这个invoke返回的object可以是函数的返回值,可以进行值类型的转换,切记注意看首字母
							request.setAttribute("finalResult",(Float)result);
							request.getRequestDispatcher("index.jsp").forward(request, response);
						}else{
							System.out.println("Operation failed!Please ReTry!!");
						}
					}
				}
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
<!--
Author:Lovingshu's Forever
Date:2011-10-23 20:45
Remark:I become lazy this time!!But only this time!I'd play FFIX for 5 houres!
-->

你可能感兴趣的:(struts,String,object,filter,Class,methods)