一、实验目的
学习struts框架结构;
学习struts中action、struts.xml的编写;
二、实验内容
1.用struts来开发的一个web应用,实现struts的property标签来获取Action中的属性,并直接显示在页面之中。
- strut简单的综合应用:设计有一定通用性的数据库查询系统,用户提供数据库名和查询语句,则能够对指定的数据库进行指定的查询。
需要jar包:
然后加入如下的jar包:
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.5.jar
struts2-core-2.3.4.1.jar
xwork-core-2.3.4.1.jar
下载链接:struts实验所需jar包-Java文档类资源-CSDN文库
也可自己准备jar包
三、设计流程
(一)用struts开发的一个web应用,实现struts的property标签来获取Action中的属性,并直接显示在页面中。
(1)在Eclipse中新建Dynamic Web Project项目:struts2,并且修改web.xml文件。(记得一定要安装到应用程序的WEB-INF\lib目录中)
(2)编写一个HelloReader.jsp文件
(3)编写Action类,给它命名为HelloReader。
(4)在classpath (即项目的src目录) 下新建struts.xml。
(5)使用下面的URL访问查看内容。http://localhost:8080/struts2/HelloReader.action
(二)简单的综合应用
设计有一定通用性的数据库查询系统(登录页面),用户提供数据库名和查询语句,则能够对指定的数据库进行指定的查询。
(1) 编写一个名为SqlJavaBean的javabean,实现数据库连接功能。
(2) 创建一个tab_user表,里面要有用户名(name)和密码(password)。
(3)定义一个名为DAO类,对用户表(tab_user)进行增删改查(CRUD)。
(4)编写实现登陆功能action,取名为AdminloginAction。
(5)修改struts.xml文件。
(6)分别编写adminLogin.html,adminLoginSuccess.jsp,adminLoginFail.jsp以及adminLoginError.jsp
(7)使用下面的URL访问http://localhost:8080/struts2/adminlogin.html,会显示如下结果,输入用户名与密码之后,如果与tab_user表中相同,则显示登录成功页面,否则会显示登录失败页面。
四、思考题
1. Struts****的功能体现在哪些方面?
答:
Struts的功能可以如下面思维导图来表示:
(1)Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。
(2)使用OGNL进行参数传递。
OGNL提供了在Struts2里访问各种作用域中的数据的简单方式
(3)强大的拦截器
Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的
(4)易于测试
Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例
(5)模块化管理
Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。
(6)全局结果与声明式异常
为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。
*2. 如何配置Struts*的核心过滤器?
答:FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器。配置如下:
在web.xml中添加以下代码:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. Struts的Action是什么,简述Action****类的基本结构。
答:
Struts的Action****:在struts2的应用开发中,Action作为框架的核心类,实现对用户请求的处理,Action被称为业务逻辑控制器。一个Action代表一次请求或调用,每个请求都会对应Action类中的一个方法,然后由这个方法进行业务处理。也就是说Action用来处理一次用户的请求对象。
Struts的Action本质就是Servlet,它作为java web应用的控制层,它完成浏览器的请求后返回一个页面给客户端浏览器。
Action****类的基本结构:继承ActionSupport类,并重写excute方法,用于处理请求。
*4. 理解Struts的Action*的属性驱动与模型驱动。
答:
Struts的Action****的属性驱动:在action中设置属性,属性的名称和页面上表单中的name属性的名称保持一致,在action中的属性,必须有set和get方法。这样设计可以保证action与servlet容器松耦合。
五、源代码清单
(一)实现struts的property标签来获取Action中的属性,并直接显示在页面中。
(1)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(2)HelloReader.jsp文件.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>一个Struts2页面</title>
</head>
<body>
<h1><s:property value="message" /></h1>
<h2><s:property value="message2" /></h2>
</body>
</html>
(3)HelloReader.java(Action类)
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloReader extends ActionSupport {
private static final long serialVersionUID = 1L;
public static final String MESSAGE ="Hello I'm from Struts 2";
public static final String MESSAGE2 ="恭喜你 成功配置好了Struts 2";
@Override
public String execute() throws Exception {
setMessage(MESSAGE);
setMessage2(MESSAGE2);
return SUCCESS;
}
private String message;
private String message2;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage2() {
return message2;
}
public void setMessage2(String message2) {
this.message2 = message2;
}
}
(4)struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="tutorial" extends="struts-default" namespace="/">
<action name="HelloReader" class="com.test.action.HelloReader">
<result>/HelloReader.jsp
</result>
</action>
</package>
</struts>
(二)简单的综合应用
(1)数据库代码
DROP TABLE IF EXISTS `tab_user`;
CREATE TABLE `tab_user` (
`u_name` varchar(40) NOT NULL,
`u_password` varchar(100) NOT NULL,
PRIMARY KEY (`u_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tab_user` VALUES ('pppp', 'qwertrty');
INSERT INTO `tab_user` VALUES ('张三', '2143243');
(2)SqlJavaBean.java
package com.test.javabean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SqlJavaBean {
private String driverClass;
private String urlpath;
private String myurl;
private String username;
private String password;
public String getDriverClass() {
return driverClass;
}
public void setDriverClass(String driverClass) {
this.driverClass = driverClass;
}
public String getUrlpath() {
return urlpath;
}
public void setUrlpath(String urlpath) {
this.urlpath = urlpath;
}
public String getMyurl() {
return myurl;
}
public void setMyurl(String myurl) {
this.myurl = myurl;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public SqlJavaBean()
{
try{
setDriverClass("com.mysql.jdbc.Driver");
setUrlpath("jdbc:mysql://localhost:3305/");
setUsername("root");
setPassword("123456");
}catch(Exception e)
{
System.out.print("Connect fail");
e.printStackTrace();
}
}
public Connection dbconn(String dbname) throws ClassNotFoundException, SQLException
{
Connection conn = null;
setMyurl(urlpath+dbname);
Class.forName(driverClass);
conn=DriverManager.getConnection(myurl, username, password);
return conn;
}
}
(3)AdminUserDao.java
package com.test.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.test.javabean.SyySqlJavaBean;
public class AdminUserDao {
SyySqlJavaBean dbconn;
Connection conn = null;
Statement stmt = null;
ResultSet result = null;
int rs;
public AdminUserDao() throws ClassNotFoundException, SQLException {
dbconn = new SyySqlJavaBean();
conn = dbconn.dbconn("movie");
stmt = conn.createStatement();
}
public Boolean InsertUser(String name, String password) throws SQLException {
rs = 0;
Boolean flag = false;
String strSql = "insert into tab_user values('" + name + "','" + password + "')";
rs = stmt.executeUpdate(strSql);
if (rs != 0) {
flag = true;
}
stmt.close();
conn.close();
return flag;
}
public Boolean checkUser(String name, String password) throws SQLException {
Boolean flag = false;
result = stmt.executeQuery("select u_name,u_password from tab_user");
while (result.next()) {
if (result.getString(1).trim().equals(name.trim())
&& result.getString(2).trim().equals(password.trim())) {
flag = true;
break;
}
}
result.close();
stmt.close();
conn.close();
return flag;
}
}
(4)AdminLoginAction.java:
package com.test.action;
import java.sql.SQLException;
import com.opensymphony.xwork2.ActionSupport;
import com.test.dao.AdminUserDao;
public class AdminLoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private String password;
private AdminUserDao dbcurd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
try {
dbcurd = new AdminUserDao();
if (dbcurd.checkUser(getName(), getPassword())) {
return "execute success";
} else {
return "execute fail";
}
} catch (SQLException e) {
return "input";
}
}
}
(5)struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="tutorial" extends="struts-default" namespace="/">
<action name="AdminLoginAction" class="com.test.action.AdminLoginAction">
<result name="execute success">adminLoginSuccess.jsp</result>
<result name="execute fail">adminLoginFail.jsp</result>
<result name="input">adminLoginError.jsp</result>
</action>
</package>
</struts>
注意:在写struts.xml文件的时候出现了****The content of element type "struts" must match
** "((package|include|bean|constant)*,unknown-handler-stack?)".**的错误。
出现该错误说明xml不符合dtd规范,提示信息已经给出来了,它的意思是struts下的子节点只能是package、include、bean或者constant。而我struts标签下却有**<action/>,所以报错。解决办法是将<action/>标签移到package**的子节点中。
(6)adminLogin.html
<!DOCTYPE html>
<html>
<head>
<title>管理员登录页面</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<h1>请输入用户名和密码:</h1>
<form method="post" action="AdminLoginAction">
<table>
<tr>
<td>用户名:</td>
<td><input name="name" type="text"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input name="password" type="password"></td>
</tr>
<tr>
<td></td>
<td>
<input name="ok" type="submit" value="提交">
<input name="cancel" type="reset" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>
(7)adminLoginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录成功页面</title>
</head>
<body>
<h1>恭喜您,登录成功。</h1>
<h1>欢迎进入本系统!!</h1>
</body>
</html>
(8)adminLoginFail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录失败页面</title>
</head>
<body>
<h1>很遗憾,您登录失败。</h1>
<h1>请尝试重新登录本系统。</h1>
</body>
</html>
(9)adminLoginError.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录错误页面</title>
</head>
<body>
<h1>呀!出错了。</h1>
<h1>请检查错误情况。</h1>
</body>
</html>
六、调试与测试结果
(一)实现struts的property标签来获取Action中的属性,并直接显示在页面中。
(二)简单的综合应用
(1)输入url后显示登录页面。
(2)输入正确的用户名和密码。
(3)登录成功页面。
(4)输入错误的用户名和密码提交后则显示登录失败页面。
版权归原作者 钻仰弥坚 所有, 如有侵权,请联系我们删除。