STRUTS2实验报告
Struts2漏洞测试书面报告

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地址。
实验六 Struts2 的开发应用

实验六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>.部署并浏览该页面。
java基于Struts2的留言板程序

实验报告课程名称基于Struts2的留言板程序实验名称JSP编程实验类型设计型实验地点计算机楼304机房实验日期2011年5月10日9~12节指导教师李文超专业计算机科学与技术班级0802学号0811010209姓名李鑫成绩辽宁石油化工大学计算机与通信工程学院一.实验目的:1.掌握Struts2配置2.掌握Struts2标签库的使用;3.掌握Action编写二.实验内容:编写一个小型留言板程序1.实现留言功能;2.查看用户留言;3.利用Struts2验证框架为注册和登录页面增加验证功能。
完成JSP页面及相应的JA VA代码。
数据库结构(仅供参考):(id,message,author,postTime)三.实验环境:JDK1.6/Tomcat 6.0.29/myeclipse6.5/MySQL5.5四.报告要求1.给出数据库表结构2.给出JSP页面和JA VA主要代码3.实验结果(页面抓图)4.实验总结五、实验方案:1.建立用户数据库,和一个user表内容包括(username,password)插入一个用户建立留言版的信息表:create table message(id varchar(30),message varchar(200),author varchar(50),posttime timestamp(6))2.连接数据库3.布置JSP界面4.针对每一个功能点,编写一个action类。
编写相关的结果页面。
针对action返回的结果代码,编写相应的结果页面。
5.利用Struts2验证框架为注册和登录页面增加验证功能。
6.进行测试,调试程序六、实验代码:package login.sql;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class BaseDao {public final static String DRIVER = "oracle.jdbc.driver.OracleDriver";public final static String URL= "jdbc:oracle:thin:@127.0.0.1:1521:myoracle";public final static String DBNAME = "scott";public final static String DBPASS = "123456";public static Connection getConnect() throws ClassNotFoundException, SQLException {Class.forName(DRIVER);return DriverManager.getConnection(URL, DBNAME, DBPASS);}public static void closeAll( Connection conn, PreparedStatement pstmt, ResultSet rs ) {if(rs != null){try { rs.close();} catch (SQLException e) {e.printStackTrace();}}if(pstmt != null){try { pstmt.close();} catch (SQLException e) {e.printStackTrace();} }if(conn != null){try { conn.close();} catch (SQLException e) {e.printStackTrace();} }}public static int executeSQL(String preparedSql,String[] param) {Connection conn = null;PreparedStatement pstmt = null;int num = 0;try {conn = getConnect(); pstmt = conn.prepareStatement(preparedSql);if( param != null ) {for( int i = 0; i < param.length; i++ ) {pstmt.setString(i+1, param[i]); }}num = pstmt.executeUpdate(); } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e) {e.printStackTrace(); } finally {closeAll(conn,pstmt,null);}return num;}}package login.bean;public class User {private String userName;private String password;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;}}package login.action;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Map;import er;import login.sql.*;import org.apache.struts2.interceptor.RequestAware;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport implements SessionAware,RequestAware{private User user;private int id;//method 2private Map session;private Map request;private Connection con;private PreparedStatement pstmt;private ResultSet rs;public Map getRequest() {return request;}public void setRequest(Map request) {this.request = request;}public Map getSession() {return session;}public void setSession(Map session) {this.session = session;}public int getId() {return id;}public void setId(int id) {this.id = id;}public User getUser() {return user;}public void setUser(User user) {er = user;}public String execute() throws Exception {if(null==user)return INPUT;String sql="select count(*)from users where userName=? and password=?";pstmt=BaseDao.getConnect().prepareStatement(sql);pstmt.setString(1, user.getUserName());pstmt.setString(2,user.getPassword());rs=pstmt.executeQuery();if(rs.next()){session.put("user", user);return SUCCESS;}elsereturn INPUT;}}JSP代码:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Login</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form name="loginForm" action="login.action?id=123" method="post"><div align="center"><br>用户名:<input type="text" name="erName"><br></div><div align="center"><br>密码:<input type="password" name="user.password"><br><input type="submit" value=" 登录 "></div></form></body></html><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>index</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>Welcome to jsp. <br><br>用户名:<s:property value="erName"/><br/>密码:<s:property value="user.password"/></body></html>七.实验结果:注册验证:八.实验总结本次是实验主要在java中使用jsp编程来制作一个简单的登录界面,利用jsp来实现动态网站的制作。
Struts2实践总结

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类的基本用法,掌握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. 完成对出版社信息的修改和删除功能。
网络工程网络编程实验报告7-struts2程序

《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>。
Struts2全部实验报告
实验时间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,查看运行结果。
实验4Struts2的个人信息管理系统项目实训
封装了业务逻辑和数据访问代码,通过 DAO模式实现数据访问。
界面设计
01
02
03
界面风格
采用简洁、明了的界面风 格,使用统一的配色方案 和布局。
导航菜单
设计清晰的导航菜单,方 便用户快速找到所需功能。
输入表单
提供友好、易用的输入表 单,确保用户能够快速、 准确地输入数据。
数据库设计
数据库选择
采用MySQL数据库,确保数据的 安全性和可靠性。
安全加固
加强系统的安全性措施,如数据加密、 权限控制等,确保系统安全稳定运行。
06 项目总结与展望
项目总结
项目目标达成情况
个人信息管理系统的核心功能,如用户注册、登录、信息 查询、修改和删除等,均已实现。系统运行稳定,用户体 验良好。
团队协作与沟通
团队成员分工明确,沟通顺畅。通过定期的会议和讨论, 及时解决遇到的问题,确保项目进度按计划进行。
技术选型与实现
采用Struts2框架,实现了MVC设计模式,简化了代码结 构,提高了开发效率。同时,结合使用JDBC和SQL实现了 数据库操作。
项目收获与不足
技术能力提升
团队成员通过实践,加深了对 Struts2框架的理解和应用。
团队协作经验
成员间通过合作,提高了团队协 作和沟通能力。
项目收获与不足
项目范围
01
本项目主要涉及个人信息管理相 关的功能模块,不涉及其他复杂 业务逻辑和功能模块。
02
重点在于掌握Struts2框架在Web 应用开发中的应用,熟悉MVC设 计模式,了解Java Web开发的相 关技术和工具。
02 系统需求分析
用户角色分析
总结词
用户角色分析是系统需求分析的重要环节,需要明确系统中的不同用户角色及 其权限和功能需求。
实验六 Struts2开发(二)
实验五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。
j2ee实验一实验报告
《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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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之间的对应关系。
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方法publicstring execute() throws exception{ map session = actioncontext. ().getsession(); session.put(rand , null); string ver2 = (string )session.get(rand); if (mgr }returnreturn}else{if (vercode.equals(ver2)) { } else{ addactionerror(验证码不匹配,请重新输入); }returnfailure; } 业务逻辑层:publicint adduser(string user , string pass , string email) }publicvoidsave(user user){ gethibernatetemplate().save(user); } throws exception{ try{ user u = new user(); u.setuser(user); userdao returne.printstacktrace(); } catch thrownew exception(新增用户时出现异常); } sessionfactory是hibernate的持久化操作的基础对象,是整个数据库经过编辑后的内存镜像,通常对应一个底层数据库。
进行hibernate的持久化操作前,必须先完成sessionfactory的初始化。
本系统通过spring容器管理sessionfactory,从而允许开发人员无需手动管理hibernate的sessionfactory。
代码如下:<beanid=sessionfactoryclass=org.springframework.orm.hibernate3.localsessionfactorybean><propertyname=datasourceref=datasource/><propertyname=mappingresources> <list> <value>user.hbm.xml</value></list> </property> <propertyname=hibernateproperties> <props> > <propkey=show_sql>true</prop><propkey=hibernate.hbm2ddl.auto>update</prop> <propkey=hibernate.dialect> <propkey=hibernate.jdbc.batch_size>20</prop> </props></property> </bean> dao组件是基于hibernate的持久化操作的,因此必须获得sessionfactory的引用才可以进行持久化操作。
由于系统的dao组件将由spring容器来管理,而且系统的sessionfactory也是由spring的容器来管理,因此dao组件无需显示去的sessionfactory的引用,而是接受spring容器注入即可。
配置如下:<beanid=userdaoclass=org.reg_erdaohibernate > <propertyname=sessionfactoryref=sessionfactory/> </bean>配置业务逻辑组件所依赖的dao组件。
代码如下:<beanid=mgrclass=org.reg_ermanagerimpl><propertyname=userdaoref=userdao/> </bean>在spring容器中配置了业务逻辑组件后,还必须为业务逻辑方法增加事物控制。
因为用户的业务逻辑方法对应用户的一次业务请求,通常而言,用户的每次业务请求都是逻辑不可分的,一次应该为该方法增加事物控制。
本系统采用spring的beannameautoproxycreator后处理器完成。
代码如下:<beanid=transactionmanagerclass=org.springframework.orm.hibernate3.hibernatet ransactionmanager><propertyname=sessionfactoryref=sessionfactory/> </bean> <beanid=transactioninterceptorclass=org.springframework.transactio n.interceptor.transactioninterceptor> name=transactionmanagerref=<propertyname= <props> <propkey=get*>propagation_required,readonly</prop><propkey=*>propagation_required</prop> </props></property></bean><beanclass=org.springframework.aop.framework.autoproxy.beannameautoproxycreator>篇二:struts2 实验报告_01 篇三:struts2 实验报告实验报告实验课程:struts2框架应用开发院系(部):应用统计与理学系专业班级:数学与应用数学1301学号:1309401012姓名:田从从成绩:实验日期:一、实验名称:struts2开发环境的搭建二、实验目的:1、下载struts2框架;2、搭建struts2开发环境三、实验内容:1、下载最新版本的struts2;2、为web应用搭建struts2开发环境四、实验步骤:2、下载myeclipse,安装并配置在window下选择preferences,在java下选择installedjres,在它的右方选择add…,把jdk的路径添加进去,按finish完成。