构建Struts1.x项目

一、搭建环境

1.导入jar包(本人下载的是struts-1.3.10-all.zip),将里面struts的lib目录下的jar包全部导入。

2.在WEB-INF下建立一个配置文件:struts-config.xml,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!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>
  <!-- 让Struts知道LoginForm,提供给Action使用 ,name为Form的引用名,type为所对应的Form类的全名-->
  <form-bean name="loginForm" type="cn.itcast.LoginForm"></form-bean>
  <form-bean name="addStudentForm" type="cn.itcast.AddStudentForm"></form-bean>
 </form-beans>
 <!-- <action-mappings>元素帮助进行框架内部的流程控制,可将请求URI眏射到Action类,将Action对象与ActionForm对象相关联。<action-mappings>元素可定义多个<action>子元素 -->
 <action-mappings>
  <!-- <action>所描述的是特定的请求路径和一个相应的Action类之间的映射关系。有以下属性:
  attribute:设置和Action关联的form bean在request/session内的属性key,通过request/session的getAttribute(attribute)方法返回该 form bean实例。
  input:当表单验证失败时将请求转发的URL,如果 表单校验不通过则跳转到到该值所代表的目标模块 -->
  <!-- 配置Action,path为ActionServlet能够找到LoginAction,type为Action的类的全名,name指明ActionServlet所用的Form(即用来存放表单提交过的的值的Form,没有的话会将空指针异常) -->
  <action path="/login" type="cn.itcast.LoginAction" name="loginForm">
  <!-- forward实现跳转 ,name指定跳转方式,path指定跳转页面,相当于键值对-->
   <forward name="loginSuccess" path="/LoginSuccess.jsp"></forward>
   <forward name="loginFailure" path="/LoginFailure.jsp"></forward>
  </action>
  <action path="/addStudentAction" type="cn.itcast.AddStudentAction" name="addStudentForm" scope="request" validate="true" attribute="addStudentForm1" input="/ErrorInput.jsp">
   <forward name="addStudentSuccess" path="/AddStudentSuccess.jsp"></forward>
   <forward name="addStudentFailure" path="/AddStudent.jsp"></forward>
  </action>


<!-- *代表通配符,在{1}出现的地方和前面的*保持一至,这可以用于配置一类类似的文件名。path和type为action必须配置的参数,validate表示在填充Form时是否需要校验,默认值为true表示需要校验。input是校验不通过后返回的页面。--> 

<action            path="/Edit*"

               type="org.apache.struts.webapp.example.Edit{1}Action"

               name="{1}Form"

              scope="request"

             validate="false">

    <forward name="sucess" path="/{1}.jsp/">

  </action>

 <action         path="/Save*"

              type="org.apache.struts.webapp.example.Save{1}Action"

              name="{1}Form"

             scope="request"

    <set-property property="cancellable" value="true"/>

  </action>



 </action-mappings>
 <!-- 全局跳转,当有两个或两个以上的Action要跳到同一个页面时使用 -->
 <global-forwards>
  <forward name="error" path="/Error.jsp"/>
 </global-forwards>
</struts-config>

3.web.xml中注册struts中心控制器--ActionServlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name> 
 
  <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>0</load-on-startup><!-- 服务一启动时就进行实例化 -->
  </servlet>
 
  <servlet-mapping>
   <servlet-name>action</servlet-name>
   <url-pattern>*.do</url-pattern> <!--让所有的*.do的请求都进这里-->
  </servlet-mapping>
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

二、那立一个类,继承ActionForm:package cn.itcast;

import org.apache.struts.action.ActionForm;

public class LoginForm extends ActionForm {
 private String username=null;
 private String password=null;
 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;
 }
}

注册修改配置文件struts-config.xml

见上。

三、开发Action:

1.建立一个类,继承Action,覆盖execute方法,需要强制转型:

package cn.itcast;

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;

public class LoginAction extends Action {

 @Override
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
//  继承父类(父类会将表单提交的值放在form中传递过来),调用LoginForm来存放表单传送过来的值(即将form强转为LoginFrom )
  LoginForm loginForm=(LoginForm)form;
//  从LogginForm中将值取出来业务逻辑处理
  String returnURLKeyWord="";
  if(loginForm.getUsername().equals("itcast")){
   returnURLKeyWord="loginSuccess";
  }else{
   returnURLKeyWord="loginFailure";
  }
//  通过使用struts-config.xml配置的父类(先带着跳转方式跳转到ActionServlet再由ActionServlet选择跳转页面 )实现跳转
  return mapping.findForward(returnURLKeyWord);
 }
}

注册,修改配置文件struts-config.xml

见上。

四、界面JSP

 <body>
   <!-- request.getContextPath():工程上下文,login.do中login是从struts-config.xml下action中的path中拷贝过来的 -->
   <!-- form表单提交给login.do,进入前端控制器ActionServlet(web.xml:*.do)然后再转入后端控制器LoginAction(struts-config.xml:login) -->
    <form action="<%=request.getContextPath() %>/login.do" method="post">
    <!-- 各表单控件的name属性必须和提交后的Form中的属性名一至,否则会出现空指针异常 -->
    username:<input type="text" name="username"><br>
    password:<input type="password" name="password"><br>
    <input type="submit" value="login"><br>
    </form>
  </body>

五、注意事项

1、Action是单实例和线程不安全的,在Action中最好不要有可读写的变量。

2、struts-config.xml文件中的<action>元素的path属性中没有.do,原因是映射到struts的路径可以不是.do的,是不是.do还是.htm什么的由web.xml决定,因此设计时要考虑当web.xml中的配置可以动态更改的问题。

3、struts-config.xml文件中的<action>元素的path属性必须以“/”开头,forward中配置的jsp文件路径也必须以“/”开头,总之,在web应用程序中记住路径总是以“/”开头,就错不了!

原文地址:https://www.cnblogs.com/mingforyou/p/2267861.html