前些天学习了struts框架.现在把我的学习心得记下来和大家分享一下.
java最先用于web开发时,它没有现在的jsp或其他view工具,那时我们只能通过把html代码写到servlet中,以此把运行后的结果返回给client,但是这大大加重了程序员的负担并且这样也把前台和后台混合在一起给开发带来了问题,是前台和后台耦合在一起.sun公司为了消除此缺点,开发了jsp,让jsp负责显示。这样它就把显示和控制分开了,减少他们之间的耦合度.基于此,sun公司提出了model1,就是人们常说的jsp+javabean的模式,model1很好的解决了上面的问题,但是它也有自己的缺点,它在开发一些小型项目时还可以,但是用model1开发大型的项目那么就会出现很多问题,比如他的扩展性很差,如果客服更改了需求那么我们改的时候就会不只改一个地方。这样还不如从做。基于此又提出了model2,该模型简单的说就是mvc,把各个层分开,不相互影响,让程序员只关注它自己的业务逻辑,界面人员只关注它自己的界面设计。mvc通俗的说就是model-view-controler,model就是模型层它包括系统内部的状态和改变这些状态的业务逻辑。view就是显示给客服看的界面通常用jsp或其它视图组件.controler就是控制器它通过把请求转发到相应的业务逻辑处理方法上进行处理.以下是一个简单的mvc模型图.
struts就是基于此模型开发的,我这里介绍的是struts1.3,struts现在还有另一个版本struts2.x它是基于webwork的,这里不做介绍.
struts是apche组织的一个开源项目,它使我们开发基于mvc的项目时非常方便,只需要按照步骤就可以开发了。下面我们就来开发一个简单的struts入门程序。首先我们要搭建好我们的环境。我用的是myeclipse6.0+jdk1.6+tomcat6.x.
首先我们先要到apache网站上下载支持struts的jar包,我们到http://struts.apache.org/下载最新的版本,目前是struts1.3.10.我们下载完整版本.下载完毕后我们解压到我们的磁盘上。它有四个目录,apps目录是它自带的例子,我们自学时可以参照它.docs是它的帮助文档。lib是它的核心酷以及支持它的第3方类库。src是struts的源代码.我们打开myeclipse,新建一个javaweb项目名字叫login,然后我们引入struts的jar包.在我们刚解压下来的目录下找到lib目录,把里面的jar包全部引入到项目中去.然后配置web.xml文件.这时我们不知道怎样配置,我们可以参照struts提供的例子来配置.我们到apps目录下解压struts-blank-1.3.10.war文件,解压后把里面的web.xml文件拷贝到你的项目中去.这是它的核心配置:
<web-app>
<display-name>Struts Blank Application</display-name>
<!-- Standard Action Servlet Configuration -->
<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>
<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>
<!-- The Usual Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
配置了actionservlet这就是mvc中的c,配置它就是告诉系统所有请求交给它处理.这里还配置了struts-config.xml文件,这是告诉系统struts的配置文件在哪里,在这里这个配置文件可以省略,因为struts的默认配置文件名就是struts-config.xml,如果你更改了名字这时你才必须配置它,其它的以后在说.配置好了web.xml文件我们就开始写代码.
我们下创建一个login.jsp的页面,其中有2个参数name,password,form表单中的action属性先不写.然后我们创建一个actionform的子类,因为struts提供了一个类可以帮我们自动接收页面中穿过来的数据,我们只需要继承它就可以了.以下是loginForm类:
package com.yu.actionform;
import org.apache.struts.action.ActionForm;
/**
*
* 接受数据的actionform
*
*/
public class loginForm extends ActionForm {
private String name;
private String password;
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;
}
}
然后我们写处理改请求的处理类,该处理类也要继承struts提供的Action类:
package com.yu.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.yu.actionform.loginForm;
/**
*
* @处理login页面的请求的处理类
*
*/
public class loginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
loginForm lf=(loginForm)form;
String name=lf.getName();
String password=lf.getPassword();
String msg=null;
if(name==null||name.equals("")){
msg="名字不能为空";
request.setAttribute("error",msg);
return mapping.findForward("error");
}
if(password==null||password.equals("")){
msg="密码不能为空";
request.setAttribute("error",msg);
return mapping.findForward("error");
}
if("yu".equals(name)&&"zxy".equals(password)){
msg="登录成功!";
}else{
msg="登录不成功!";
}
return mapping.findForward("success");
}
}
然后配置该action处理类:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.yu.actionform.loginForm"/>
</form-beans>
<action-mappings>
<action path="/login" name="loginForm" type="com.yu.action.loginAction" input="/login.jsp">
<forward name="success" path="/success.jsp"/>
<forward name="error" path="/login.jsp"/>
</action>
</action-mappings>
</struts-config>
然后执行,执行成功就会显示登录成功,执行失败就会显示失败.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.yu.actionform.loginForm;
/**
*
* @处理login页面的请求的处理类
*
*/
public class loginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
loginForm lf=(loginForm)form;
String name=lf.getName();
String password=lf.getPassword();
String msg=null;
if(name==null||name.equals("")){
msg="名字不能为空";
request.setAttribute("error",msg);
return mapping.findForward("error");
}
if(password==null||password.equals("")){
msg="密码不能为空";
request.setAttribute("error",msg);
return mapping.findForward("error");
}
if("yu".equals(name)&&"zxy".equals(password)){
msg="登录成功!";
}else{
msg="登录不成功!";
}
return mapping.findForward("success");
}
}