<!--[if !supportLists]-->l         <!--[endif]-->Struts框架简介
框架:就是对需要重复开发的代码进行封装,可以提高开发的效率,设置开发的规范
 
在使用 Struts 之前的开发 JSP àServletàDAOàServletàJSP
JSP中要显示传递数据时需要使用<%getAttribute()%> 而且需要穿插HTML 代码 Servlet中接收参数和跳转历经的配置 都会给维护带来问题
 
Struts可以对上述内容进行处理
Struts MVC设计模式的具体实现
 
StrutsApach组织的开源框架. JSFSun官方推出的
 
<!--[if !supportLists]-->l         <!--[endif]-->Struts框架开发
使用Struts完成登陆程序
<!--[if !supportLists]-->1.    <!--[endif]-->建立一个Web项目
<!--[if !supportLists]-->2.    <!--[endif]-->MyEclipse中为项目添加Struts支持(项目—>鼠标右键àMyEclipseàAdd Struts capabilites)


      3.
->Struts confi path:Struts核心配置文件路径, 所有关于Struts的配置都保存在该文件中
->ActionServlet name:可以自定义
->ActionServlet 的作用:为了使提交的路径可以跳转到Struts编写的类中 需要通过一个Servlet来统一管理跳转的路径,这里当提交的路径包含.do 的时候表示该提交会提交到Struts
4.项目在加入了Struts支持后

Src
(1).多了一个资源文件ApplicationResources.properties
     Jar
      (2).项目中加入了 Struts1.2Libraries 即加入了多个Struts支持所需的jar
     WEB-INF
      (2).WEB-INF下加入了Struts核心配置文件 struts-config.xml
      (3).WEB-INF下加入了*.tld即标签文件的支持 bean,html,logic,nested,titles
      (4).WEN-INF下加入了动态验证规则文件validator-rules.xml
      (5).WEB-INF下的 Web.xml中新加入了一个ActionServlet的配置


    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
<!-- struts-config.xml文件名称可以根据需求更改-->
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>3</param-value>
        </init-param>
<!--启动时0秒加载 启动时servlet便初始化 即启动时struts便可以使用-->
        <load-on-startup>0</load-on-startup>
    </servlet>
<!--通过提交到*.do而找到此servlet 从而找到核心配置文件struts-config.xml-->
    <servlet-mapping>
        <servlet-name>action</servlet-name>
<!--*.do可以根据需要修改 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

5.建立一个JSP页面

建立好的JSP与不使用strutsJSP有以下区别
     <%@ page language="java" pageEncoding="GB18030"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>

(1).这里没有导入java.util.*包 表示使用struts后可以在页面上不需要导入java.util.*就可以显示列表内容
(2).<%@ taglib uri="" prefix="" %>添加标签语法
    Uri为标签的唯一标识   prefix 表示该标签使用时的前缀可以修改  <bean:xxx></bean>
    如果使用struts2.0开发可以按此格式添加标签
6.编写登陆页面
    <html:html>
    <head>
        <title>login.jsp</title>
    </head>
    <body>
    <center>
    <!--显示全部错误信息: <font color="red"><html:errors /></font> -->
    <font color="red"><html:errors property="loginErrors" /></font>
        <html:form action="login.do" method="post">
            <table border="0">
                <tr>
                    <td>Username:</td>
                    <td><html:text property="username"/></td>
                    <td><font color="red"><html:errors property="unameErrors"/></font></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td><html:password property="password" /></td>
                    <td><font color="red"><html:errors property="passwordErrors"/></font></td>
                </tr>
                <tr>
                    <td></td>
                    <td align="left">
                    <html:submit value="提交"/>
                    <html:reset value="重置"/>
                    </td>
                </tr>
            </table>
        </html:form>
        </center>
    </body>
</html:html>

7.在开发完成页面后 要创建替代servlet功能的StrutsActionActionForm
New ->Other ->MyEclipse ->Struts1.2 ->Strurs1.2 Form Action&JSP
Struts1.2 ->Strurs1.2 Form Action&JSP完成Servlet的功能
Form:接收参数与验证 完成Servlet前半部分内容
Action:调用参数操作并进行跳转完成Servlet后半部分内容



(1).配置ActionForm 用来代替Servlet接收参数和验证的功能(FormBean)
此处的Use case必须与提交页面的action路径的名称的 *.do *一样
然后add提交页面中的属性 属性必须与页面中提交的页面元素的名称一致

8.可以看到在struts-config中配置好了Action ActionForm 且在项目中建立好了action form 的包类
    由于要先接受参数 因此先完成ActionForm 中的处理
<!--[if !supportLists]-->1        <!--[endif]-->配置ActionForm. ActionForm 是用来替代Servlet中接收参数和验证的功能  Use case 这里必须填写之前表单提交的路径的名称,
注意去掉 .do  还可以通过ADD按钮添加提交的属性,注意属性名称必须与页面上提交的页面元素名称一致.
 
<!--[if !supportLists]-->2        <!--[endif]-->配置Action. Action是用来处理 Servlet中其他的功能的 比如: 调用DAO 处理业务逻辑或进行跳转
可以看到在Struts-config.xml中已经配置好了 ActionActionForm 且在项目中已经建立好了 Action
ActionForm 的包.
由于需要先接受参数,所以先完成ActionForm中的处理
 
(1.1) ActionForm中完成了非空的验证 validate方法进行编写 
       private String password;
  private String username;
  //一般用来验证非空和数据格式
  public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {
    //建立一个ActionErrors对象 该对象用来保存所有出现的错误 ActionErrors是一个集合类
    ActionErrors aErrors = new ActionErrors();
    //验证非空 trim()方法用于去除首尾的空格 只是首尾的空格
    if(this.username == null || this.username.trim().equals("")) {
      //加入错误信息
      aErrors.add("unameErrors", new ActionMessage("username.null"));
    }
    //判断密码
    if(this.password == null || this.password.trim().equals("")) {
      //加入错误信息
      aErrors.add("passwordErrors", new ActionMessage("password.null"));
    }
    return aErrors;
  }

(1.2) 由于错误信息必须在资源文件中进行保存 因此 需要在资源文件中加入错误信息的配置
jdk安装目录中的bin中找到native2ascii.exe 在其中输入中文 即可转化为需要的编码

 username.null=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a!<br>
password.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01<br>
login.error=\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef\uff01

(1.3) 测试后 发现可以完成验证功能 但无法显示错误信息可以修改login.jsp 在其中加入错误信息
    <!--显示全部错误信息: <font color="red"><html:errors /></font> -->
  显示指定的错误信息<font color="red"><html:errors property="loginErrors" /></font>

(2.1) 编写 Action 完成用户名和密码的验证
    public class LoginAction extends Action {
  /**
    * Method execute
    * @param mapping
    * @param form
    * @param request
    * @param response
    * @return ActionForward
    */

  public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
    //可以直接调用form中的getter方法获取提交的参数
    LoginForm loginForm = (LoginForm) form;
    if(loginForm.getUsername().equals("cgz")&&loginForm.getPassword().equals("5982285")) {
      //登陆成功 将用户名保存在session中
      request.getSession().setAttribute("username", loginForm.getUsername());
      //跳转 在Action中 跳转是通过返回值来处理的
      //return new ActionForward("/success.jsp");
      return mapping.findForward("success");
    }else {
      //登录失败 返回登陆页面 同时显示错误信息 Input Source里面设置的内容
      //注意是ActionMessages而不是ActionMessage
      ActionMessages aMessages = new ActionMessages();
      aMessages.add("loginErrors", new ActionMessage("login.error"));
      //this.addErrors()不是this.addMessages()
      this.addErrors(request, aMessages);
      return mapping.getInputForward();
    }
  }
}
(2.2) 返回登陆页面 显示错误信息
    <html:html>
    <head>
        <title>login.jsp</title>
    </head>
    <body>
    <center>
    <!--显示全部错误信息: <font color="red"><html:errors /></font> -->
    <font color="red"><html:errors property="loginErrors" /></font>
        <html:form action="login.do" method="post">
            <table border="0">
                <tr>
                    <td>Username:</td>
                    <td><html:text property="username"/></td>
                    <td><font color="red"><html:errors property="unameErrors"/></font></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td><html:password property="password" /></td>
                    <td><font color="red"><html:errors property="passwordErrors"/></font></td>
                </tr>
                <tr>
                    <td></td>
                    <td align="left">
                    <html:submit value="提交"/>
                    <html:reset value="重置"/>
                    </td>
                </tr>
            </table>
        </html:form>
        </center>
    </body>
</html:html>