在介绍Struts框架之前,先来了解一下Web开发的两种模式,这两种模式自从JSP开发流行起来,就一直在业界,争论不休,那就是我之前在博客:《JSP技术中的Model1和Model2开发模式》中介绍的JSP Model1和JSP Model2.因此这里就不再对这块内容进行赘述了。
通过了解JSP的Model1 和Model2,想必大家在心里都有了自己的选择,相比较而言,Model2比Model1更加的方便和和简洁,这里,我们不去说哪种架构更好,在不同的应用场景中,使用恰到好处的技术才是最好的选择,并不是说框架本身有多么好,脱离了应用场景,我们是无法清晰的认识到技术框架的优势的。但是,通常意义上来说,Model2引入的MVC模式是一个有伟大思想意义的东西,这是众所周知的。
而我们今天所要讨论的Struts框架正是MVC思想最佳实践的一个经典产品。虽然Struts1在现在已经逐渐退出业界舞台,但是其中的思想精髓还是值得我们去学习和研究的,首先我们来看一下Struts的框架概览图,以便于大家对Struts有一个全局的认识和了解:
接着我们来分析如何实现第一个Struts框架的示例代码,首先我们要明白Struts框架的执行流程,先画个图来捋捋我们都需要创建哪些文件,以及各个文件之间的关联关系,如下图所示:
搞清楚了怎么弄我们就要开始动手了。
第一步:引入Struts框架,搭建开发环境
从分析来看,我们需要一个ActionForm,一个Action,三个JSP页面,外加一个业务逻辑类UserManager类,用来处理登录用户的信息并且返回结果。
小结一下:
Struts1框架是对MVC模式的一个最佳实践,自她出道以来,为广大程序开发人员所钟爱,并且为我们的程序开发工作带来了非常多的便利,提高了开发效率,实在是一个非常经典的产品,但是之后出现的Struts2,让其逐渐失宠,渐渐的淡出了我们的视线,虽然现在已经鲜有人用,但是她作为一个历史悠久的MVC框架,影响了不计其数的开发者,某种意义上说,很多人就是通过Struts的学习而认识MVC的,感谢Struts1为程序开发做出的贡献,一路走好!
通过了解JSP的Model1 和Model2,想必大家在心里都有了自己的选择,相比较而言,Model2比Model1更加的方便和和简洁,这里,我们不去说哪种架构更好,在不同的应用场景中,使用恰到好处的技术才是最好的选择,并不是说框架本身有多么好,脱离了应用场景,我们是无法清晰的认识到技术框架的优势的。但是,通常意义上来说,Model2引入的MVC模式是一个有伟大思想意义的东西,这是众所周知的。
而我们今天所要讨论的Struts框架正是MVC思想最佳实践的一个经典产品。虽然Struts1在现在已经逐渐退出业界舞台,但是其中的思想精髓还是值得我们去学习和研究的,首先我们来看一下Struts的框架概览图,以便于大家对Struts有一个全局的认识和了解:
第一步:引入Struts框架,搭建开发环境
打开Myeclipse,新建一个Java Web Project,然后将Struts相关的jar包拷贝到Project的WEB-INF/lib目录下;
然后在web.xml文件里面配置ActionServlet,并且复制一个struts-config.xml文件,放到源码文件src下或者是WEB-INF下(其实放在哪里无所谓,只要在配置文件中把文件的路径配置好就可以)。web.xml文件的配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
第二步:创建并且编写相应的代码文件从分析来看,我们需要一个ActionForm,一个Action,三个JSP页面,外加一个业务逻辑类UserManager类,用来处理登录用户的信息并且返回结果。
LoginAction的代码(需要继承Action类)
/**
* 登录Action
* 负责取得表单数据、调用业务逻辑、返回转向信息
*
* @author Administrator
*
*/
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// LoginActionForm laf = (LoginActionForm)form;
// String username = laf.getUsername();
// String password = laf.getPassword();
// if ("admin".equals(username) && "admin".equals(password)) {
// //登录成功
// return mapping.findForward("success");
// }else {
// //登录失败
// return mapping.findForward("error");
// }
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
UserManager userManager = new UserManager();
try {
userManager.login(username, password);
//request.setAttribute("username", username);
return mapping.findForward("success");
}catch(UserNotFoundException e) {
e.printStackTrace();
request.setAttribute("msg", "用户不能找到,用户名称=【" + username + "】");
}catch(PasswordErrorException e) {
e.printStackTrace();
request.setAttribute("msg", "密码错误");
}
return mapping.findForward("error");
}
}
LoginActionForm的代码(需要继承ActionForm类)
/**
* 登录ActionForm,负责表单收集数据
* 表单的属性必须和ActionForm中的get和set的属性一致
* @author Administrator
*
*/
@SuppressWarnings("serial")
public class LoginActionForm extends ActionForm {
private String username;
private String password;
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;
}
}
UserManager的代码
public class UserManager {
public void login(String username, String password) {
if (!"admin".equals(username)) {
throw new UserNotFoundException();
}
if (!"admin".equals(password)) {
throw new PasswordErrorException();
}
}
}
Struts-config.xml文件的配置信息
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.ljw.struts.LoginActionForm"/>
</form-beans>
<action-mappings>
<action path="/login"
type="com.ljw.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp" />
<forward name="error" path="/login_error.jsp"/>
</action>
</action-mappings>
</struts-config>
login.jsp的代码
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="login.do" method="post">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"></br>
<input type="submit" value="登录">
</form>
</body>
</html>
至此,我们的第一个Struts框架的代码示例就完成了,接下来测试一下,将项目部署到tomcat,并且启动tomcat,然后在浏览器中输入地址访问我们的程序,就可以看到效果了。小结一下:
Struts1框架是对MVC模式的一个最佳实践,自她出道以来,为广大程序开发人员所钟爱,并且为我们的程序开发工作带来了非常多的便利,提高了开发效率,实在是一个非常经典的产品,但是之后出现的Struts2,让其逐渐失宠,渐渐的淡出了我们的视线,虽然现在已经鲜有人用,但是她作为一个历史悠久的MVC框架,影响了不计其数的开发者,某种意义上说,很多人就是通过Struts的学习而认识MVC的,感谢Struts1为程序开发做出的贡献,一路走好!