第一个Struts项目

正式接触Java大名鼎鼎的三大开源框架之一的Struts,由于之前的不管是实验还是项目都是基于Servlet的,所以说如果使用Servlet进行Web工程搭建可谓是驾熟就轻,但是当我刚刚接触Struts的时候我就迷糊了,就像搭建Servlet项目,使用Struts搭建Web项目的流程是什么呢,我想不管是学什么,恐怕这个都是一个比较关键的问题,下面我就用已登录为例,来分享一下我这几天学习Struts的搭建流程的心得。

首先,还是需要使用MyEclipse创建一个Web Project出来,这个就不再赘述了。紧接着,问题就来了,如何才能使用Struts呢?其实很简单,就是导入Jar包(Struts的下载地址:Struts下载),下载的是一个压缩包, 解压缩后就是下面几个目录:apps,docs,lib,,src,LICENSE.txt,NOTICE.txt;其中apps就相当于Tomcat中的webapps是一样的,它里面是打成war包的实例项目,可以拷贝到Tomcat中直接运行的;docs是Struts的文档;lib目录就是我们在项目会使用的各个jar包;scr里面就是Struts框架的源代码,很重要的,如果想要将框架真的学透,里面的代码是免不了要去钻研的。

了解完Struts的结构之后我们就可以着手去构建我们自己的项目了,但是在这之前,我们可以将apps下的struts-blank-1.3.10.war实例工程复制到Tomcat的webapps下,并启动Tomcat,访问http://localhost:8080/struts-blank-1.3.10/index.jsp就可以看到欢迎信息了,当你看到这些信息的时候,就说明你成功部署了Struts项目,然后我们再回到Tomcat的webapps下你会发现多了一个struts-blank-1.3.10目录,这个就是那个复制进去的war包自动解压的目录了。进去之后你会发现跟我们使用Servlet构建的项目的目录其实是一样的,但是在WEB-INF下有一个配饰文件struts-config.xml请引起注意,这个是非常重要的,它和web.xml在一级目录下,都是非常重要的配置文件,接下来的项目你就会明白这个文件的作用。至此,我们已经对Struts项目有了一个模糊的印象,但是,还是不知道如何构建自己的项目,别急,接着往下看。

下面我们开始构建自己的项目了,我们之前已经构建出了一个Web Project,我们在工程下创建一个文件夹:libs,用于存放项目的所有jar包,并将我们刚才看到测试的那个空白工程下所用到的所有jar包复制过来(apache-tomcat-7.0.57\webapps\struts-blank-1.3.10\WEB-INF\lib)一共是10个,这里我们暂时不需要使用Struts解压后那个lib下 的jar包,因为那里还有很多我们目前用不到的。复制完成后一定不要忘记了在MyEclipse中项目的那个WebRoot下的WEB-INF下的lib也放一份刚才复制的jar包,因为MyEclipse不会自动部署那些jar进入Tomcat。复制完成之后就将这些jar包加载到项目中去,这个就是常规的导包的过程,不再赘述。

紧接着,就要使用我们上面所提到的一个很重要的配置文件:struts-config.xml了,我们可以直接将演示的空白项目下的那个文件复制到我们的项目当中来,也可以自己创建,但是一定要正确,下面是刚刚创建的空白的文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "struts-config_1_3.dtd" >
<struts-config>

</struts-config>
这个就是最原始的文件,我们接下来的配置工作就在<struts-config>中进行。这个文件与web.xml在同一级目录。

好了,准备工作已经完成了,我们已经将Struts项目的框架搭建起来了,很明显的我们可以发现,这个与使用Servlet没多大区别。很是很容易上手的,那么接下来我们就要对这个框架进行填充了。来做一些具体的工作。

这里我们先提一个概念就是ActionServlet,这是Struts的五大组件中的一个,他是所有外部连接过来的一个必经的组件(可以先理解成一个过滤器),既然它是外部进入的一个入口,那么肯定就要在工程启动的时候让它加载到项目中,这个怎么做呢,回想一下Servlet中的编码过滤器,它是如何启动的,或许可以给我们一下灵感,那就是在web.xml中配置,让它启动时自动加载。配置方式如下:

<web-app>
	<servlet>
		<servlet-name>ActionServlet</servlet-name>
		<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
		<init-param>
			<param-name>congif</param-name> <!-- 必须是这个名字 -->
			<param-value>/WEB-INF/struts-config.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>ActionServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
</web-app>
这里就是使用web.xml配置了ActionServlet的启动方式,并且将struts-config.xml加载进来了,其中<servlet-map>就是声明了凡是链接进来.do的操作都是需要进过ActionServlet(这里的.do是可以根据自己的设置的,如.go,.action,只有与使用的相配合就可以了)。这里我们就完成了struts-config.xml的加载。

下面我们进入实际的业务逻辑代码阶段:

首先,准备三个简单的jsp页面:

登录界面:

<body>
	<form name="login" id="login" action="<%=path%>/login.do" method="post">
		<table border="0">
			<tr>
				<td>UserName:</td>
				<td><input type="text" name="userName" id="login"></td>
			</tr>
			<tr>
				<td>Password:</td>
				<td><input type="password" name="password" id="password"></td>
			</tr>
			<tr>
				<td colspan="2" align="center" ><input type="submit" value="Login"></td>
			</tr>
		</table>
	</form>
</body>
登录失败界面:

<body>
   	<p>Login Failure!!!</p>
  </body>
登陆成功界面:

<body>
    	<p>Login Successed!!!</p>
  </body>
请注意在登录界面的表单的action="<%=path%>/login.do",这里的.do是与配置的想协同的,而<%=path%>则是路径,会Servlet的都会很熟悉的,当我们点击登录的时候就会提交一个请求到服务器中去,在Struts下,这个请求会经过ActionServlet。但是数据的验证在何处进行的呢。这里就用到了一个新的知识:Action,我们需要继承org.apache.struts.action.Action并重写它的execute方法,并在struts-config.xml中配置它。我,我们来看是怎么操作的。

我们创建一个LoginAction类,并继承自Action:

public class LoginAction extends Action{
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		String userName = request.getParameter("userName");
		String password = request.getParameter("password");

		if(userName.equals(password)){
			request.getRequestDispatcher("/success.jsp").forward(request, response);
		}else{
			request.getRequestDispatcher("/failure.jsp").forward(request, response);
		}
	<span style="white-space:pre">	</span>return null;
	}
}

写到这里大家可能会说,这不就是Servlet吗,没错,ActionServlet就是一个Servlet,而Action是的execute使用的就是Servlet使用的HttpServletRequest和HttpServletResponse,我们先不谈这个,在Servlet中我们在外部访问的时候直接就会给出具体的Servlet名称,但是这里是.do我们要如何才能进入到这个Action中呢,这就是struts-config.xml的作用,我们来看看这个Action是如何被启用的:

<action-mappings>
		<!-- path:调用的路径,跟<servlet-mapping>中的<url-pattern></url-pattern>一样 此时在form中调用的就是使用此路径了,并在调用时添加类型如.do 
		     type:类 -->
		<action path="/login" type="com.defens.action.LoginAction" name="loginForm">
		</action>
	</action-mappings>
看这里的path,你也许会注意到,只有/login啊,为什么没有.do呢, 其实使用的.do是配合进入ActionServlet这个大的过滤器的,实际上Action是通过我们前台提交的名称来确定,在经过ActionServlet后,会根据配置文件,选择出相关的Action,至此,我们已经完成了一个Struts项目的搭建,就可以将其部署到Tomcat中,然后访问了。

启动Tomcat并输入:http://localhost:8080/struts-blank-1.3.10/index.jsp

输入用户名“123”, 密码“123”


请注意地址栏的内容,我们再输入用户名“123”, 密码“456”

至此,已经完成了整个过程,看到这里可能会有人对其很失望,这不还是Servlet吗,我干嘛费那么多力气去配置这个呢,我直接就可以用Servlet,那是因为目前我们还没有用到Struts真正厉害的地方。下面我们对我们的代码进行重构。

再提一个组件:ActionFomom,这个类是一个JavaBean,它和我们前台的form表单有联系,其中的属性会根据form表单中的参数进行设置,当我们在前台执行一个form表单的时候,数据会自动封装到这个类中,它需要继承ActionForm,并在struts-config.xml中配置,上代码:

创建类LoginForm,继承ActionForm,

public class LoginForm 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;
	}
}
这就是一个简单的JavaBean,只不过继承了ActionForm罢了,下面我们在配置文件中进行配置:

<!-- 配置Form -->
	<form-beans>
		<form-bean name="loginForm" type="com.defens.form.LoginForm"></form-bean>
	</form-beans>
同样在LoginAction我就可以进行相关的重构了:

我们了解一下execute函数的参数:

execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) 

其中ActionMap就是我们等下要介绍的如何实现跳转的内容,ActionForm就是我们正在说的,它是Struts对前台form表单封装成我们实现的类并作为参数传递到这里供我们使用,剩下的两个就使我们非常熟悉的了,就不在赘述了。

代码重构如下:

		//String userName = request.getParameter("userName");
		//String password = request.getParameter("password");
		
		LoginForm loginForm = (LoginForm)form;
		String userName = loginForm.getUserName();
		String password = loginForm.getPassword();
这就是直接获取的form表单的对象,这样我们就不需要关注前台到底使用了什么样的字段作为参数。

我们再介绍一个新的组件:ActionMapping,它是读取配置信息的一个组件,在最原始的代码中我们看到了我们跳转的方式是通过硬编码的方式写入到代码中的,这样很不利于程序的扩展,我们比较希望是能在配置文件中管理联系,这样即使我们的需求变了,我们就可以通过修改配置文件,而不是去修改源代码。那么跳转的方式又是怎做的呢,看下面的配置:

<action path="/login" type="com.defens.action.LoginAction" name="loginForm">
	<!-- 配置跳转 -->
	<forward name="success" path="/success.jsp"></forward>
	<forward name="failure" path="/failure.jsp"></forward>
</action>
在源代码中:

if(userName.equals(password)){
<span style="white-space:pre">	</span>//request.getRequestDispatcher("/success.jsp").forward(request, response);
	return mapping.findForward("success");
}else{
	//request.getRequestDispatcher("/failure.jsp").forward(request, response);
	return mapping.findForward("failure");
}
可以看到,这样做带来的明显的好处就是我们只要关注与配置文件就可以了。

重构完成之后我们再重新部署项目,再次运行,其结果跟上面展示的是一模一样的。

至此我们第一个Struts项目就算完成了。

是不是很复杂,肯定有人说是,我们把一个简单的东西搞得这么复杂有什么必要呢?这就要关注程序的扩展性了,我们前面是将所有信息写入到代码中去的,就是硬编码的方式,这样可能在实现的时候会很简单,但是我们再二次开发或者需求变化的时候就会发现,那样的代码改起来的代价是多么得大。

关于Struts的优点我就不说了,也不是这篇文章关注的地方。

下面我们来梳理一下构建Struts工程的步骤:

1、创建Web工程;

2、引入Jar包

3、添加struts-config.xml文件与web.xml同级目录

4、在web.xml中配置ActionServlet

使用servlet的<init-param>引入3中的配置文件

5、创建Action,重写execute方法(业务逻辑)

6、在struts-config.xml中配置Action

7、构建ActionForm,并配置

8、构建跳转映射,ActionMapping


文章有点长,就是我学习的过程,写出来跟大家分享下,希望大神给与指点。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值