struts2 实验报告
- 格式:docx
- 大小:180.33 KB
- 文档页数:10
Struts2漏洞测试书⾯报告Struts2 漏洞测试报告信息化建设处2016年6⽉15⽇Struts2 漏洞测试报告0.前期⼯作准备前期的⼯作主要围绕以下⼏个⽅⾯进⾏:分析从2014年以来Struts2官⽅所披露的⼏个⾼危/重要漏洞的版本号、形成的原因、影响的范围以及修复的建议。
了解乌云知识库⾥对相关漏洞原理的分析对学校218和216⽹段的所有开启“Apache Tomcat/Coyote JSP”服务的IP进⾏扫描,并根据服务器所属的业务,对⽬标IP进⾏分类处理。
0.1Struts2重要漏洞的类型纵观2014年以来Struts2官⽅所披露的各种漏洞,归纳起来,主要有3种类型:“classLoader导致特定环境下的DOS漏洞”、“开启DMI导致的远程代码执⾏漏洞”和“使⽤REST插件导致的远程代码执⾏漏洞”。
本次测试根据此3种类型,选取具有代表性的⼏个重要漏洞进⾏分析。
S2-037[1]:2016年6⽉16⽇,乌云漏洞报告平台,报告了⼀份最新的S2-037漏洞(官⽅⽹站仍未正式更新)。
主要原因是使⽤REST插件导致的远程代码执⾏漏洞,受影响的版本号为2.3.20-2.3.28.1。
S2-032[2]:2016年4⽉21⽇Struts2官⽅发布S2-032漏洞,评级为⾼。
主要原因是在开启动态⽅法调⽤(Dynamic Method Invocation,DMI)的情况下,会被攻击者实现远程代码执⾏攻击,受影响的版本号为2.3.18-2.3.28 ( 2.3.20.2和2.3.24.2除外)。
S2-021/S2-020[3][4]:2014年左右频繁爆发的漏洞类型主要是“classLoader导致特定环境下的DOS漏洞”,受影响的版本号为2.0.0 - 2.3.16.1。
0.2Nmap扫描结果与分类在分析测试之前,由于没有218和216段服务器的相关资料,为了避免盲⽬地进⾏测试,因此,选⽤nmap⼯具,对218和216段(⼀共512个IP)进⾏扫描,从⽽得到所有开启“Apache Tomcat/Coyote JSP”服务的IP地址。
实验2 Struts2类型转换(2学时)题目/任务1.掌握基于OGNL的类型转换。
2.掌握基于OGNL表达式对于Map集合的转换。
难度系数知识点说明/训练要点1.基于OGNL的类型转换。
2.基于OGNL表达式对于Map集合的转换。
实现效果1、运行结果:a)基于OGNL的类型转换:b)基于OGNL表达式对于Map集合的转换实现步骤1、搭建环境。
◆将当前目录下,环境工程包内StrutsDemo20文件导入到eclipse中。
2、进行实验。
在edu.zb.entity包下有一个User实体类,User里有userName、password、age属性。
并且已添加set、get方法以及有参和无参的构造方法,并且重写了toString()方法。
◆基于OGNL的类型转换:●打开edu.zb.action包下的loginAction类,添加一个User类型的user属性。
并添加set、get方法。
●打开WebContent目录下的login.jsp页面,将第一个“<s:textfield>”标签里的name和id属性改为“erName”。
●将第二个“<s:textfield>”标签里的的name和id属性改为“user.age”。
●将“<s:password>”标签里的name和id属性改为“user.password”。
●打开WebContent目录下的index.jsp页面,在body使用ValueStack对象实现获取引用的过程:调用request的getAttritube(“struts.valueStack”)方法,返回ValueStack类型的对象,命名为vs,然后跳跃vs的findString(“user”)方法获得user的相关属性值。
实际代码如下所示:●在第一行里page属性后面添加对相关类的导入。
如下所示:●运行login.jsp,在login、年龄、pass文本框内分别输入”admin”、“20“、”123456 “。
实验六Struts2 的开发应用网络11-2班3110757214 陈宇鹏一、实验目的理解MVC设计模式的基本概念和Java Web开发的两种模式Model1和Model2,以及Struts开发工作流程和基本应用。
二、实验要求1.掌握Struts2.0的开发环境的建立。
2.理解Struts的框架原理。
3.掌握Struts的工作流程。
4.掌握Struts2.0的基本应用。
三、实验内容(一)Struts2的文件上传1.文件上传页面,其中包含两个表单域:文件标题和文件浏览域♦程序功能:上传页面,包含两个表单域。
♦程序源码:upload.html<html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=GBK" /><title>简单的文件上传</title></head><body><form action="upload.action" method="post" enctype="multipart/form-data">文件标题:<input type="text" name="title" /><br>选择文件:<input type="file" name="upload" /><br><input value="上传" type="submit" /></form></body></html>2.处理上传请求的Action类程序源码:UploadAction.javapublic class UploadAction extends ActionSupport{private String title;private File upload;private String uploadContentType;private String uploadFileName;//接受依赖注入的属性private String savePath;//接受依赖注入的方法public void setSavePath(String value){this.savePath = value;}private String getSavePath() throws Exception{return ServletActionContext.getRequest().getRealPath(savePath);}public void setTitle(String title) {this.title = title;}public void setUpload(File upload) {this.upload = upload;}public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType;}public void setUploadFileName(String uploadFileName) {this.uploadFileName = uploadFileName;}public String getTitle() {return (this.title);}public File getUpload() {return (this.upload);}public String getUploadContentType() {return (this.uploadContentType);}public String getUploadFileName() {return (this.uploadFileName);}@Overridepublic String execute() throws Exception{System.out.println("开始上传单个文件-----------------------");System.out.println(getSavePath());System.out.println("==========" + getUploadFileName());System.out.println("==========" + getUploadContentType());System.out.println("==========" + getUpload());//以服务器的文件保存地址和原文件名建立上传文件输出流FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());FileInputStream fis = new FileInputStream(getUpload());byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) > 0){fos.write(buffer , 0 , len);}return SUCCESS;}}1.配置文件上传的Action程序源码:Struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/><package name="lee" extends="struts-default"><action name="upload" class="lee.UploadAction"><param name="savePath">/upload</param> <result>/succ.jsp</result></action></package></struts>.部署并浏览该页面。
Struts2中的属性驱动和模型驱动Struts2中的属性驱动和模型驱动2Struts2中的异常处理机制ognl表达式Struts2中文件的上传和下载拦截器Struts2中的输入校验Struts2中的类型转换使用Annotation取代struts.xml配置Struts2中文乱码处理Struts2常用标签UI标签的主题设置Struts2与AJAX交互◆驾驭XML数据◆驾驭JSON数据第一个Struts2程序当我们在一个新的工作空间中创建一个Web项目的时候首先要将我们自己的Tomcat绑定到MyEclipse中。
接下来我们可以使用自己安装的JDK,Windows→Preferences→输入Installed JREs建一个Web Project拷struts.xml(可从下载的struts目录下的示例中拷)。
将<struts>标签下的内容都注释掉,这样自己写的时候可供参考。
拷struts2所需要的lib,直接从示例中拷,只需要8个(首字母以c、c、c、f、j、o、s、x 开头,其中的javaassist包一定不能少)查看项目目录在磁盘上的结构:Window→Show View→Navigator在web.xml文件中配置Struts2的核心控制器(直接从示例中拷)下面我们修改struts.xml文件,添加以下配置:<package name="default" namespace="/" extends="struts-default"><action name="hello"><result>/Hello.jsp</result></action></package>我们将原来的index.jsp改名为Hello.jsp,打开该JSP文件(使用MyEclipse JSP Editor打开,不要使用默认的图形编辑器打开,这样速度很慢),适量修改一下页面信息。
实验六 Struts2 Action实验(一)
一、实验目的:
熟悉Struts2 Action类的基本用法,掌握Struts2 Action类在MVC程序开发中的编写和应用,初步实现CRUD编程。
二、实验内容:
在MyEclipse环境下运用Struts2技术改写实验四内容,完成相应的数据库CRUD功能,调试运行程序。
三、实验要求:
1. 掌握运用Struts2 开发MVC程序的基本步骤;
2. 掌握Struts2 Action接收请求参数、调用业务逻辑、封装结果数据并转向结果页面的
用法
3. 掌握在struts.xml文件中对Struts2 Action的基本配置;
4. 运用相关技术(Struts2以及JDBC等)完成规定功能;
5. 写出实验报告。
四、实验学时:2学时
五、实验步骤:
1.进入MyEclipse环境,新建一个Web Project;
2. 设计一个数据库,包括出版社表和书籍表,出版社表字段包括序号(自增主键)、出版
社编码和出版社名称,书籍表字段包括序号(自增主键)、书号、书名、作者、价格和出版社;
3. 采用Struts2技术完成出版社基本信息管理模块的主要功能,包括:
3.1 设计封装了出版社表信息的JavaBean;
3.2 设计封装了针对出版社表信息进行CRUD操作的工具JavaBean(DAO类);
3.3 设计并开发页面
3.4 设计并开发Action控制器
3.5. 完成显示所有出版社信息的功能;
3.6. 完成对出版社信息的增加功能;
4. 调试运行程序。
六、选作实验
1. 完成对出版社信息的条件查询功能;
2. 完成对出版社信息的修改和删除功能。
《J2EE程序设计与应用开发》实验报告实验序号:07 实验项目名称:struts2程序学号姓名专业、班20网络工程实验地点指导教师实验时间2022一、实验目的及要求1、利用Struts编写用户登录。
二、实验设备(环境)及要求一台Windows XP、JDK1.6、MyEclipse 8.5三、实验内容与步骤四、实验结果与数据处理1、输入相同的账号和密码2、输入不同的账号和密码附源程序清单:1、Login.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><html><body><form action="/prj14/login.action" method="post">请您输入账号:<input name="account" type="text"><br>请您输入密码:<input name="password" type="password"><br><input type="submit" value="登录"></form></body></html>2、LoginSuccess.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><html><body>登录成功</body></html>3、LoginFail.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><html><body>登录失败</body></html>LoginActionpackage prj14;public class LoginAction {private String account;public String getAccount(){return account;}public void setAccount(String account){this.account=account;}private String password;public String getPassword(){return password;}public void setPassword(String password){this.password = password;}public String execute() throws Exception{if(account.equals(password)){return "success";}return "fail";}}6、struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "/dtds/struts-2.1.dtd"><struts><package name="struts2" extends="struts-default"><action name="login" class="prj14.LoginAction"><result name="success">/loginSuccess.jsp</result><result name="fail">/loginFail.jsp</result></action></package></struts>。
沈阳工学院综合实验验收报告题目:论坛系统的设计与实现院系:信息与控制学院专业:计算机科学与技术班级学号: 11301203 11301103 11301228 学生姓名:韩雨辰赫梓屹田皓指导教师:靳新成绩:2013年 12 月 15 日综合实验论坛系统的设计与实现【开发语言及实现平台或实验环境】Windows系统,JDK,myEclipse开发环境,Tomcat服务器,Struts2、Hibernate开发平台【实验要求和内容】论坛系统是用于用户之间交流的一个信息平台,它是网站开发中很典型的一个例子,通过网上论坛系统的设计和开发掌握Struts2和Hibernate实现的基本功能。
●系统基本功能系统分为前台和后台,分别为用户和管理员提供不同的功能服务,对普通用户来说,系统提供注册、登录、浏览信息、发帖、回贴等功能;对管理员来说,系统提供登录验证、管理帖子、管理用户等功能。
●系统功能模块及介绍论坛系统的设计与实现前台用户模块后台管理员模块用户注册登录模块信息浏览模块发帖回帖模块管理员登录验证模块帖子管理模块管理用户模块图1 系统功能模块图♦前台用户模块(1)用户注册登录模块:为新用户提供填写表单注册成为会员的服务;为已注册的会员提供登录验证的服务,验证成功后就可以登录系统。
(2)信息浏览模块:用户可以浏览帖子列表、详细内容及回帖内容。
(3)发帖回帖模块:已登录的合法用户可以发帖和回帖。
♦后台管理员模块(1)管理员登录验证模块:对管理员的身份进行验证,只有管理员才能登录后台。
(2)帖子管理模块:对帖子提供修改、删除操作。
(3)管理用户模块:提供删除用户的功能。
1 系统分析与设计1.1 需求分析1.1.1 功能性需求开发BBS论坛系统的目的是提供一个供用户交流的平台,为广大用户提供交流经验、探讨问题的社区。
因此,BBS论坛系统最基本的功能首先是发表主题,其次是其他人员根据主题发表自己的看法。
此外,为了记录主题的发表者和主题的加复者信息民,系统还需要提供用户注册和登录的功能。
实验时间2015年11月6日19:00时至22:00时学时数 4 1.实验名称实验一:熟悉Struts2核心文件2.实验目的(1)熟悉Struts2的配置文件web.xml和struts.xml。
(2)熟悉如何书写用户定义的控制器。
(3)深刻理解DMI和通配符的使用。
(4)学会struts2接收参数的方法。
3.实验内容(1)将如下页面中登陆和注册的action配置用通配符实现。
(2)理解局部结果和全局结果,学会在struts.xml 中配置全局结果。
(3)实现增加书籍信息的业务处理。
(4)修改管理员登陆后的页面并新写页面addBook.jsp,使得点击添加书籍信息后呈现下面的页面4.实验原理或流程图要求:➢管理员登录后跳到管理员登陆成功的页面➢普通用户登录后跳到普通用户登陆成功的页面➢注册后跳到注册成功的页面➢登录时用户名密码输入错跳到出错页➢注册和登录时用户名,密码没有输入时跳到登陆注册页,并在登陆注册页上显示校验失败的相关提示。
要求如下:➢当输入书名,作者和定价后,要求使用属性驱动、模型驱动或今天新学的接收参数的方法进行参数接收。
➢使用集合模拟数据库。
➢理解chain结果类型,使得增加书籍后马上能将新增书籍的信息显示出来。
呈现出如下的页面:(注意:此处需要学会读取struts2中ValueStack中的内容)5.实验过程或源代码6.实验结论及心得通过本此实验,知道了Action配置采用通配符的方式该如何编写,也会了动态调用Action里面的方法,懂得了全局结果的配置,也会使用了接受参数的方法。
项目名称/login.jsp,查看运行结果。
(3)使用内置校验器进行校验项目3:用户注册验证。
步骤1:register.jsp文件步骤2:Register.java文件步骤3:新建 Register-register-validation.xml文件步骤4:struts.xml文件步骤5:运行程序,URL地址栏中输入http://主机名:端口名称/项目名称/register.jsp,查看运行结果。
Struts2学习总结(完整版)⼀、搭建struts2环境1、jar包的导⼊主要是到解压其中的⼀个⼯程,得到⾥⾯lib下包含的jar包把这⾥的所有的jar包拷贝到项⽬的WEB-INF⽬录下的lib⽂件夹下⾯。
2、配置struts.xml⽂件注意:必须要放在src⽬录下,因为struts2源码就是这样设计的,只有在src⽬录下才读取得到。
每⼀个package都要extends=”struts-default”,namespace 是访问的路径Action中的name和 package中的namespace组成完整的访问路径3、配置web.xml<filter><filter-name>action2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>action2</filter-name><url-pattern>/*</url-pattern></filter-mapping>4、编写的Action类都要继承ActionSupport类或者implements Action接⼝默认action类访问的是⾥⾯的execute⽅法如果要访问特定的⽅法,可以这样:(1)在action 后⾯指定 method=“⽅法名”(2)使⽤通配符 <action name=”example_*” class=”com.XX.YY.ZZ” method=”{1}” />(3)使⽤动态表达式⽐如example!execute(不常⽤)5、接收表单提交的数据(1)属性驱动获取表单参数--在action类中定义与表单的input中 name ⼀样的属性(必须⼀样,否则注⼊不进去)同时还要⽣产属性对应的set ⽅法,因为 action类要调⽤set⽅法把表单中的参数注⼊到属性中(2)模型驱动获取表单参数--模型驱动⾸先action类要实现ModelDrivern,然后重写getModel⽅法--在action类中声明并创建接收表单参数的实体类(Student user = new Student())--原理分析:struts2调⽤action类的getModel⽅法,得到user对象,然后利⽤user对象⾥⾯的set属性的⽅法,设置user对象的属性值--注意,表单的参数name必须要跟Student的属性值⼀致,否则注⼊不进去。
实验五Struts 2开发(二)【实验目的】:1.进一步掌握Struts应用程序开发的步骤2.理解拦截器的机制和作用3.掌握拦截器的开发、配置和引用。
4.理解如何使用Struts2框架实现文件上传和下载。
【实验内容】:开发和使用拦截器;利用Struts 2框架实现文件上传。
【实验步骤】:(一) 拦截器的使用拦截器是动态拦截Action调用的对象。
它提供一种机制,使开发者可以定义一段代码,在Action执行之前或之后被调用执行,也可以在一个Action执行前阻止其执行。
同时也提供了一种可以提取Action中可重用部分的方式。
Struts 2设计的灵巧性,很大程度上得益于拦截器设计,拦截器几乎完成了Struts 2框架70%的工作,包括解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等。
当需要扩展Struts 2功能时,只需要提供对应拦截器,并将它配置在Struts 2容器中即可,如果不需要该功能,也只需取消该拦截器的配置即可。
Struts 2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中。
打开此文件,观察其结构和内容。
simpleInterceptor应用程序的开发步骤(1)在MyEclipse的workspace中新建Web工程simpleInterceptor。
导入Struts2开发需要用到的类库。
其目录结构如下:(2)将Struts 2框架的支持类文件复制到WebRoot/WEB-INF/lib目录下。
(3)创建包org.crazyit.app.action包,其下建立Action类LoginAction。
当用户访问login.jsp页面时,如果输入用户名:101031.2 密码:student。
LoginAction执行完后将返回SUCCESS视图。
其代码如下:package org.crazyit.app.action;import com.opensymphony.xwork2.ActionSupport;public class LoginActionextends ActionSupport{private String username;private String password;//username的setter和getter方法public void setUsername(String username){ername = username;}public String getUsername(){return username;}//password的setter和getter方法public void setPassword(String password){this.password = password;}public String getPassword(){return password;}public String execute() throws Exception{System.out.println("进入execute方法执行体..........");Thread.sleep(1500);if (getUsername().equals("SE")&& getPassword().equals("student") ){return SUCCESS;}else{return ERROR;}}}(4)创建包org.crazy.app.interceptor包,其下建立拦截器类SimpleInterceptor。
《JAVA EE企业应用开发》综合性、设计性实验成绩单开设时间:2012学年第一学期班级10信管1班学号 1.2010302601332.2010305601313.201030560135 姓名 1.张伟东2.吴雨瑞3.郑易东实验题目实验一开发struts2程序实验成绩教师签名《JAVA EE企业应用开发》实验报告实验题目:开发struts2程序实验指导教师:杨春实验组长(姓名+学号):张伟东201030560133组员(姓名+学号):张伟东201030560133吴雨瑞201030560131郑易东201030560135实验时间:2012年11月组长签名:(手写)2012年12 月 2 日1、实验目的(1分)1).掌握用不同框架模式开发JAVA EE程序;2).使用JSP和不同框架混合模式编写一个简单的用户信息管理系统(具体描述见实验步骤部分)2、实验内容(2分)考虑实现一个数据库单表操作的简单JAVA EE WEB应用,使用struts2 框架框架中的实现.系统需求如下:普通用户功能:用户登录系统;用户注册;修改个人信息;登录后查看系统资源。
系统管理员:全部用户列表;根据姓名模糊查询符合条件的用户或用户列表;删除用户。
3、实验步骤与结果(3分)主要开发步骤如下:1)数据可设计,生成数据库;2)创建web project,名为xs;3)功能模块包划分;4)搭建系统框架;5)普通用户功能实现:注册、登录、修改个人信息等;6)系统管理员功能实现:查询、删除等。
实现结果,截图如下:数据库:Jsp界面(部分):4、架构设计+源码(2分)架构设计如下图:源码(主要):Guanli.actionpackage action;import java.util.Map;import service.IGuanliService;import service.impl.GuanliService;import vo.Guanli;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class GuanliAction extends ActionSupport{protected Guanli guanli;protected IGuanliService guanliService;protected String username;protected String password;public Guanli getGuanli() {return guanli;}public void setGuanli(Guanli guanli) {this.guanli = guanli;}public IGuanliService getGuanliService() {return guanliService;}public void setGuanliService(IGuanliService guanliService) {this.guanliService = guanliService;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String execute() throws Exception{Guanlig=guanliService.validateGuanli(guanli.getUsername(),guanli.getPassword());if(g!=null){Map session=ActionContext.getContext().getSession();session.put("guanli", g);return SUCCESS;}else{return ERROR;}}}Zhuce.actionpackage action;import java.util.Map;import service.IZhuceService;import vo.Guanli;import vo.Zhuce;import java.util.List;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class ZhuceAction extends ActionSupport{protected Zhuce zhuce;protected IZhuceService zhuceService;private String username;private String password;private String sex;private String address;public Zhuce getZhuce() {return zhuce;}public void setZhuce(Zhuce zhuce) {this.zhuce = zhuce;}public IZhuceService getZhuceService() {return zhuceService;}public void setZhuceService(IZhuceService zhuceService) {this.zhuceService = zhuceService;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String execute() throws Exception{Zhucez=zhuceService.validateZhuce(zhuce.getUsername(),zhuce.getPassword());List zcs=zhuceService.getZhuce(zhuce.getUsername());Map request=(Map)ActionContext.getContext().get("request");request.put("zcs", zcs);if(z!=null){Map session=ActionContext.getContext().getSession();session.put("zhuce", z);return SUCCESS;}else{return ERROR;}}public String zc() throws Exception{zhuceService.saveZhuce(zhuce);return SUCCESS;}public String grxx() throws Exception{List zcs=zhuceService.getZhuce(username);Map request=(Map)ActionContext.getContext().get("request");request.put("zcs", zcs);return SUCCESS;}public String sc() throws Exception{zhuceService.dl(zhuce.getUsername());List zcs=zhuceService.getZhuce1();Map request=(Map)ActionContext.getContext().get("request");request.put("zcs", zcs);return SUCCESS;}public String xg() throws Exception{zhuceService.xiugai(zhuce.getUsername(),zhuce.getPassword(),zhuce.getSex(),zhuce.get Address());List zcs=zhuceService.getZhuce(zhuce.getUsername());Map request=(Map)ActionContext.getContext().get("request");request.put("zcs", zcs);return SUCCESS;}public String cz() throws Exception{List zcs=zhuceService.cz(zhuce.getUsername());Map request=(Map)ActionContext.getContext().get("request");request.put("zcs", zcs);return SUCCESS;}}GuanliDaopackage dao.impl;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.List;import dao.BaseDAO;import dao.IGuanliDAO;import vo.Guanli;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;public class GuanliDAO extends BaseDAO implements IGuanliDAO{public Guanli validateGuanli(String username,String password){Session session=getSession();String hql="from Guanli g where ername=? and g.password=?";Query query=session.createQuery(hql);query.setParameter(0,username);query.setParameter(1, password);List guanlis=query.list();if(guanlis.size()!=0){Guanli guanli=(Guanli)guanlis.get(0);return guanli;}session.close();return null;}}ZhuceDaopackage dao.impl;import java.util.List;import dao.BaseDAO;import dao.IZhuceDAO;import vo.Zhuce;import org.hibernate.Query;import org.hibernate.classic.Session;import org.hibernate.Transaction;public class ZhuceDAO extends BaseDAO implements IZhuceDAO{public void saveZhuce(Zhuce zhuce){Session session=getSession();Transaction tx=session.beginTransaction();session.save(zhuce);mit();session.close();}public List getZhuce(String username){Session session=getSession();Query query=session.createQuery("from Zhuce z where ername=?");query.setParameter(0, username);List zcs=query.list();session.close();return zcs;}public List getZhuce1(){Session session=getSession();Query query=session.createQuery("from Zhuce z");List zcs=query.list();session.close();return zcs;}public void dl(String username){Session session=getSession();Query query=session.createQuery("delete Zhuce z where ername=?");query.setParameter(0, username);query.executeUpdate();}public void xiugai(String username,String password,String sex,String address){ Session session=getSession();Query query=session.createQuery("update Zhuce z setername=?,z.password=?,z.sex=?,z.address=? where ername=?");query.setParameter(0, username);query.setParameter(1, password);query.setParameter(2, sex);query.setParameter(3, address);query.setParameter(4, username);query.executeUpdate();}public Zhuce validateZhuce(String username,String password){Session session=getSession();String hql="from Zhuce z where ername=? and z.password=?";Query query=session.createQuery(hql);query.setParameter(0,username);query.setParameter(1, password);List zhuces=query.list();if(zhuces.size()!=0){Zhuce zhuce=(Zhuce)zhuces.get(0);return zhuce;}session.close();return null;}public List cz(String username){Session session=getSession();Query query=session.createQuery("from Zhuce z where ername=?");query.setParameter(0, username);List zcs=query.list();session.close();return zcs;}}Struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "/dtds/struts-2.1.dtd"><struts><include file="struts-default.xml"/><package name="default" extends="struts-default"><action name="zc" class="zhuceAction" method="zc"><result name="success">/success.jsp</result></action><action name="grxx" class="zhuceAction" method="grxx"><result name="success">/grxx.jsp</result></action><action name="cz" class="zhuceAction" method="cz"><result name="success">/cz.jsp</result></action><action name="sc" class="zhuceAction" method="sc"><result name="success">/sc.jsp</result></action><action name="xg" class="zhuceAction" method="xg"><result name="success">/xg.jsp</result></action><action name="dl2" class="guanliAction"><result name="success">/dl2s.jsp</result><result name="error">/dl2.jsp</result></action><action name="dl" class="zhuceAction"><result name="success">/dls.jsp</result><result name="error">/dl.jsp</result></action></package></struts>applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd"><bean id="dataSource"class="mons.dbcp.BasicDataSource"><property name="driverClassName"value="com.mysql.jdbc.Driver"></property><property name="url"value="jdbc:mysql://localhost:3306/xs"></property><property name="username" value="root"></property><property name="password" value="123"></property></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource"><ref bean="dataSource" /></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop></props></property><property name="mappingResources"><list><value>vo/Zhuce.hbm.xml</value><value>vo/Guanli.hbm.xml</value></list></property></bean><bean id="baseDAO" class="dao.BaseDAO" abstract="true"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><bean id="zhuceDAO" class="dao.impl.ZhuceDAO" parent="baseDAO"></bean><bean id="zhuceService" class="service.impl.ZhuceService"><property name="zhuceDAO"><ref bean="zhuceDAO"/></property></bean><bean id="zhuceAction" class="action.ZhuceAction"><property name="zhuceService"><ref bean="zhuceService"/></property></bean><bean id="guanliDAO" class="dao.impl.GuanliDAO" parent="baseDAO"> </bean><bean id="guanliService" class="service.impl.GuanliService"><property name="guanliDAO"><ref bean="guanliDAO"/></property></bean><bean id="guanliAction" class="action.GuanliAction"><property name="guanliService"><ref bean="guanliService"/></property></bean></beans>Dl.jsp(登录)<%@ page contentType="text/html;charset=utf-8" %><html><body><form action="dl.action" method="post">用户名:<input type="text" name="ername"/><br>密码:<input type="password" name="zhuce.password"/><br> <input type="submit" value="登录"></form></body></html>Grxx.jsp(显示会员信息)<%@ page contentType="text/html;charset=utf-8" %><%@ taglib prefix="s" uri="/struts-tags" %><html><head></head><body><s:iterator value="#request['zcs']" id="zhuce"><s:property value="#ername"/><s:property value="#zhuce.password"/><s:property value="#zhuce.sex"/><s:property value="#zhuce.address"/></s:iterator><a href="dls.jsp">返回</a></body></html>Zhuce.jsp(注册)<%@ page contentType="text/html;charset=utf-8" %><HTML> <BODY><table align="center"><tr><td height=50></td></tr><tr><td><form action="zc.action" method="post">用户名:<br><input type="text" name="ername"/><p>密码:<br><input type="password" name="zhuce.password"/><p>性别:<br><input type="text" name="zhuce.sex"/><p>地址:<br><input type="text" name="zhuce.address"/><p><input type="submit" value="注册" ></form> </td></tr><tr><td><a href="d.jsp">登录</a></td></tr></table></BODY></HTML>5、结论与讨论(2分)通过这次实验,我们小组成员认识到应用框架的方便之处和它的强大之处,虽然只是应用了其中的一小部分,但为接下去的学习打下基础。
1. 系统分析与设计 1.1 系统功能描述本系统是个非常简单的注册、登录系统。
本系统的实现是基于struts2、spring、hibernate三个框架,系统功能单一,业务逻辑简单。
当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。
当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。
系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。
系统还提供了一种ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。
故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。
当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。
除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。
1.2 系统功能流程1.3 数据库设计相关的映射文件:<hibernate-mappingpackage= <classname=user table=user_table> <id name=idcolumn=user_id> <generatorclass=identity</id> nique=true/><propertyname==user_passnot-null=true length=50/> <propertyname=emaillength=100/> </class> <propertyname=usercolumn=</hibernate-mapping>一旦提供了上面的映射文件,hibernate就可以理解user和user_table之间的对应关系。
《J2EE框架技术》课程实验报告学期:实验地点:public String checkLogin() {if (this.loginname.equals("admin") &&this.pwd.equals("admin")){//直接访问ServletAPIHttpServletRequest request = ServletActionContext.getRequest();HttpSession session = request.getSession();session.setAttribute("username", this.loginname);return SUCCESS;}elsereturn LOGIN;}}(2)获取Session<%@page language="java"pageEncoding="UTF-8"%><%@taglib prefix="s"uri="/struts-tags"%><html><body><br><center><h2>读取session中的信息:欢迎<%=session.getAttribute("username").toString() %><br><br>读取session中的信息:欢迎<s:property value="#ername"/>!<br><br>读取application中的信息:欢迎<s:property value="#ername"/>!</body></html>(3)实验结果:2.编写登录Action,在登录检查完成后,通过ActionContext获取ServletAPI的方式将用户名存到Sessionpublicclass loginAction extends ActionSupport {<br><center><h2>读取session中的信息:欢迎<%=session.getAttribute("username").toString() %><br><br>读取session中的信息:欢迎<s:property value="#ername"/>!<br><br>读取application中的信息:欢迎<s:property value="#ername"/>!</body></html>(3)实验结果:3.编写算术运算Action,实现在同一页面进行计算,在另一页面显示运算结果(直接配置Action)。
1、实验内容或题目使用Struts2实现一个简单用户注册和登录,包括用户数据库的创建、创建ODBC数据源以及用户注册和登录的类及页面的编写和部署。
2、实验目的与要求⑴掌握基于Struts2框架的简单用户注册和登录类的编写。
⑵掌握基于Struts2框架配置文件的编写和部署。
3、实验步骤与源程序(可以抓图粘贴)⑴启动SQL SERVER2000,创建数据库sampledb,并在该数据库下创建表users和books,各字段及类型等设置如下图所示,其中books表中录入几行记录数据。
在保证数据库sampledb为混合登录方式下,创建用户testuser,密码为空,默认登录数据库设置为sampledb。
(2)在windows的“控制面板”下的“管理工具”中选择“数据源(ODBC)”,创建一个系统DSN 的数据源sampletest来连接上述数据库sampledb。
(3)编写用户注册类RegisterAction.java和登录类LoginAction.java。
package struts2.actions;import ersDAO;import com.opensymphony.xwork2.ActionSupport;import java.io.UnsupportedEncodingException;public class RegisterAction extends ActionSupport{/****/private static final long serialVersionUID = -8074746026534969533L; private String username;private String password;private String dupPassword;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {(4)编写配置文件struts.xml<?xml version="1.0"encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-cla ss></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>/pages/welcome.jsp</welcome-file></welcome-file-list></web-app>(5)使用Eclipse将整个应用程序打包成struts2.war,并部署到tomcat发布路径下。
实验四Struts2综合实验实验目的:1.正确使用组件结构,在业务控制器action中调用模型model完成业务逻辑;2.掌握OGNL的使用,在JSP和action中正确使用EL;3.掌握在Struts2架构中,使用action的rich属性作为输入属性的方法。
实验要求:1.设计正确的web组件结构,业务控制器action调用模型model完成业务逻辑;2.使用使用action的rich属性作为输入属性的方法。
实验环境:MyEclips8.x+Struts2.0实验内容:正确使用MVC模式,严格区别三种角色,用JSP实现视图(V),使用action实现控制器(C),使用JavaBean实现业务业务逻辑,完成一个简单的用户登录应用。
实验步骤:准备工作同基本实验下面的实验分两种类型进行第一种类型,简单使用struts2,实现登录检测功能,不考虑复杂的中文问题,并将业务逻辑直接放在用户定义的控制器action中。
第二种类型,较综合使用struts2,实现登录检测功能,用过滤器技术解决参数传递中的中文问题,用户定义的控制器action调用bean完成业务逻辑。
Part 11.启动MyEclipse,创建一个Web工程,名称为TestStruts2。
2.增加Strut功能查看配置文件。
(1)web.xml文件配置:<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><!-- 定义Struts2的FilterDispathcer的Filter --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。
实验十Struts2和hibernate的整合应用一、实验目的1.掌握Struts2和hibernate的整合二、实验环境1.Tomcat2. MyEclipse三、实验描述1. 实验内容及要求:使用Struts2和Hibernate实现以下功能:1)插入几条新闻到数据库中;2)查询所有新闻,并在页面中显示新闻的标题、发布时间,要求对标题设置超链接,点击该链接后新开一个页面显示该新闻标题、发布时间、内容和来源;3)能够修改和删除新闻显示页面中指定的新闻;4)实现标题的模糊查询以及发布时间的范围查询;5)要求使用连接池。
6)要求使用Struts2校验框架按以下要求进行有效性校验:●对新闻标题、新闻内容作非空校验●对新闻标题、新闻来源作长度校验2.要求:1.13周的小课前上传实验报告到FTP,并请保留电子版等候通知随时打印提交2.在报告中必须附上以下截图:1)显示项目的文件结构截图,如下图所示2)显示项目的各个功能的运行结果截图3)请注意:不附截图者扣2分!四.实验步骤:①新建一个Struts2项目②为项目添加hibernate支持③创建持久化类及其映射文件④创建DAO接口及其实现类⑤创建工具类,获取Session对象⑥修改hibernate.cfg.xml⑦创建动作类,在其中调用DAO中的业务方法⑧使用Struts2校验框架校验用户输入数据的有效性:用户和密码都必须输入,确认密码必须等于密码⑨编写struts.xml文件⑩编写客户端JSP文件具体步骤请参考Struts2和hibernate的整合.ppt。
下面将按照DAO的方式完成代码的开发,首先定义VO类,VO类的名称与表的名称一致。
定义对应的vo类——News.java本程序只是一个简单的vo类,包含了属性、getter、setter方法。
其中插入日期时使用的是java.util.Date类。
提示:由于篇幅问题,所以不列举所有setter和getter方法。
1.系统分析与设计1.1 系统功能描述本系统是个非常简单的注册、登录系统。
本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。
当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。
当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。
系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。
系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。
故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。
当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。
除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。
1.2 系统功能流程1.3 数据库设计相关的映射文件:<hibernate-mapping package = <class name ="User" table ="user_table"> <id name ="id"column ="user_id"><generator class ="identity"</id ><property name ="user"column =nique ="true"/><property name ="pass"column ="user_pass"not-null ="true"length ="50"/><property name ="email"length ="100"/></class ></hibernate-mapping >一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。
2.系统实现与测试 2.1 系统采用的关键技术MVC 框架采用了Struts2框架,Struts2框架的易用性,极好的简化了系统的MVC 层的实现;本系统使用了Struts2的JSON 插件来完成Ajax 功能,除此之外本系统为了避免进行底层的Ajax 交互,还是用了一个简单Prototype.js 函数库,用以简化Ajax 编程。
Struts2框架的稳定性,为系统的稳定运行提供了保证。
Spring 容器作为系统的Ioc 容器,将系统中所有组件都放在Spring 容器中进行管理,并且充分利用了Spring Ioc 容器的功能,采用依赖注入来管理系统中各组件的依赖关系,避免了各组件之间的硬编码耦合,提高了系统的可扩展性。
借助Hibernate ORM 框架实现系统的持久化,通过Hibernate 的框架帮助,允许上层程序采用面向对象的方式编程,二Hibernate 负责把面向对象的持久化操作转换成JDBC 操作,但Hibernate 的底层操作对开发者完全透明,从而让用户从具体的JDBC 访问中释放出来,无需理会底层的JDBC 数据库访问,而是以面向对象的方式进行持久化操作。
2.2 关键程序流程以注册为例说明:加载类(FilterDispatcher )读取配置(struts 配置文件中的Regist.Action ) 派发请求(客户端发送请求)调用Action (FilterDispatcher 从struts 配置文件中读取与之相对应的Action ) 启用拦截器(WebWork 拦截器链自动对请求应用通用功能) 处理业务(回调RegistAction 的execute()方法)返回响应(通过execute 方法将信息返回到FilterDispatcher )查找响应(FilterDispatcher 根据配置查找响应的是什么信息如:SUCCESS 、ERROER ,将跳转到哪个jsp 页面) 响应用户(jsp--->客户浏览器端显示)2.3 关键代码分析Regist.action 的execute 方法public String execute() throwsException{Map session = ActionContext.getContext().getSession(); String ver2 = (String )session.get("rand");session.put("rand" , null ); if (vercode .equals(ver2)) {if (mgr return }else {return}} else {addActionError("验证码不匹配,请重新输入"); }return "failure";}业务逻辑层:publicint addUser(String user , String pass , String email) throws Exception{ try { User u = new User(); u.setUser(user);userDaoreturn }catche.printStackTrace();thrownew Exception("新增用户时出现异常"); }}publicvoid save(User user){getHibernateTemplate().save(user); }SessionFactory 是Hibernate 的持久化操作的基础对象,是整个数据库经过编辑后的内存镜像,通常对应一个底层数据库。
进行Hibernate 的持久化操作前,必须先完成SessionFactory 的初始化。
本系统通过Spring 容器管理SessionFactory ,从而允许开发人员无需手动管理Hibernate 的SessionFactory 。
代码如下:<bean id ="sessionFactory"class ="org.springframework.orm.hibernate3.Loc alSessionFactoryBean"><property name ="dataSource"ref ="dataSource"/> <property name ="mappingResources"> <list ><value >User.hbm.xml </value ></list > </property ><property name ="hibernateProperties"> <props > <prop key ="hibernate.dialect">><prop key ="show_sql">true </prop ><prop key ="hibernate.hbm2ddl.auto">update </prop ><prop key ="hibernate.jdbc.batch_size">20</prop > </props > </property > </bean >DAO 组件是基于Hibernate 的持久化操作的,因此必须获得SessionFactory 的引用才可以进行持久化操作。
由于系统的DAO 组件将由Spring 容器来管理,而且系统的SessionFactory 也是由Spring 的容器来管理,因此DAO 组件无需显示去的SessionFactory 的引用,而是接受Spring 容器注入即可。
配置如下:<bean id ="userDao"class ="org.reg_erDaoHibernate"><property name ="sessionFactory"ref ="sessionFactory"/> </bean >配置业务逻辑组件所依赖的DAO 组件。
代码如下:<bean id ="mgr"class ="org.reg_erManagerImpl"> <property name ="userDao"ref ="userDao"/> </bean >在Spring 容器中配置了业务逻辑组件后,还必须为业务逻辑方法增加事物控制。
因为用户的业务逻辑方法对应用户的一次业务请求,通常而言,用户的每次业务请求都是逻辑不可分的,一次应该为该方法增加事物控制。
本系统采用Spring 的BeanNameAutoProxyCreator 后处理器完成。
代码如下:<bean id ="transactionManager"class ="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name ="sessionFactory"ref ="sessionFactory"/> </bean ><bean id ="transactionInterceptor"class ="org.springframework.transaction.interceptor.TransactionInterceptor">name ="transactionManager"ref =<property name = <props ><prop key ="get*">PROPAGATION_REQUIRED,readOnly </prop ><prop key ="*">PROPAGATION_REQUIRED </prop ></props ></property ></bean ><bean class ="org.springframework.aop.framework.autoproxy.BeanNameAutoP roxyCreator"><property name ="beanNames"> <list ><value >mgr </value > </list > </property ><property name ="interceptorNames"> <list ><value >transactionInterceptor </value > </list > </property > </bean >由于Struts2的Action 也是由Spring 容器负责管理,因此,必须保证Spring 容器在Web 应用初始化时立即创建。