Struts(一)

===============================MVC====================================
MVC(Model View Controller)
    1.Model:封装数据,进行业务处理,返回处理结果
    2.View:展示界面
    3.Controller:接受用户端请求,将模型和视图联系在一起以实现用户请求的功能

思路:



==============================Struts===============================
介绍:
    1.Struts2是一个MVC框架。Struts1 + WebWork
    2.Struts2兼容性好
    3.http://struts.apache.org

步骤:
    1.加载类库
    2.配置Web.xml文件
    3.开发视图层页面
    4.开发控制层Action
    5.配置struts.xml文件
    6.部署、运行项目
    
    a.加载的基本jar包:
        struts2-core-xxx.jar        Struts 2框架的核心类库
        xwork-core-xxx.jar            XWork类库,Struts 2的构建基础
        ognl-xxx.jar                Struts 2使用的一种表达式语言类库
        freemarker-xxx.jar            Struts 2的标签模板使用类库
        javassist-xxx.GA.jar        对字节码进行处理
        commons-fileupload-xxx.jar    文件上传时需要使用
        commons-io-xxx.jar            Java IO扩展
        commons-lang-xxx.jar        包含了一些数据类型的工具类
        
    b.配置Web.xml

 1 <filter>
 2         <filter-name>struts2</filter-name>
 3         <filter-class>
 4             org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
 5         </filter-class>
 6 </filter>
 7         
 8 <filter-mapping>
 9         <filter-name>struts2</filter-name>
10         
11         <!--  将全部请求定位到指定的Struts2过滤器中 -->
12         <url-pattern>/*</url-pattern>
13 </filter-mapping>        


Struts2访问Servlet API -- (即,登录成功后,使用session保存用户信息)
    访问方式:
        1.解耦
            a.对Servlet API进行封装
                提供了三个Map对象访问request、session、application作用域
            b.通过ActionContext类获取这三个Map对象
                1)Object get("request")
                2)Map getSession()
                3)Map getApplication()

        2.耦合
            a.通过ServletActionContext类获取Servlet API对象
                 1)ServletContext getServletContext()
                 2)HttpServletResponse getResponse()
                 3)HttpServletRequest  getRequest()
                 4)通过request.getSession()获取session对象
            b.通过xxx.setAttribute()和xxx.getAttribute() 功能,在不同的页面或Action中传递数据

数据校验:
    1.继承ActionSupport类来完成Action开发
        validate()方法
    2.ActionSupport类不仅对Action接口进行简单实现,同时增加了验证、本地化等支持

范例:
1.index.jsp

 1 <%-- 引入JSP页面PAGE指令 --%>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8"
 3     pageEncoding="UTF-8"%>
 4 <%-- 引入JSTL标签指令 --%>
 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 6 <!DOCTYPE html>
 7 <html language="zh-CN">
 8 <head>
 9     <meta charset="utf-8">
10     <!-- 设置浏览器渲染的引擎  -->
11     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
12     <!-- 设置支持移动设备  -->
13     <meta name="viewport" content="width=device-width, initial-scale=1">
14     <title>网页标题</title>
15     <!-- 引用bootstrap样式 -->
16     <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css">
17 </head>
18 <body>
19     <!-- 从session中读取数据 -->
20     ${sessionScope.loginUser }
21     
22     ${msg }
23     <div class="container-fluid">
24         <form action="hello" method="post">
25             请输入内容:<input name="msg" type="text" />
26             请输入内容:<input name="address" type="text" />
27             <input type="submit" value="提交"/>
28         </form>
29     </div>
30     
31     <!-- 引用外部JS文件  -->
32     <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script>
33     <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script>
34 
35 </body>
36 </html>


2.HelloJspAction类

 1 package com.Elastic.StrutsDemo1.ivy.action;
 2 import com.opensymphony.xwork2.Action;
 3 public class HelloJspAction implements Action{
 4     //与jsp中的属性name的值一样
 5     private String msg;
 6     private String address;
 7     
 8     public String getMsg() {
 9         return msg;
10     }
11 
12     public void setMsg(String msg) {
13         this.msg = msg;
14     }
15 
16     public String getAddress() {
17         return address;
18     }
19 
20     public void setAddress(String address) {
21         this.address = address;
22     }
23 
24     /* (non-Javadoc)
25      * @see com.opensymphony.xwork2.Action#execute()
26      */
27     @Override
28     public String execute() throws Exception {
29         System.out.println(msg);
30         System.out.println(address);
31         return "success";
32     }
33 }


3.struts.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <!-- /:根目录 -->
 7     <package name="default" namespace="/" extends="struts-default">
 8     
 9         <!-- action中name的值与表单的action属性值对应  -->
10         
11         <!-- 请求地址:hello  class:action(servlet)地址-->
12         <action name="hello" class="com.Elastic.StrutsDemo1.ivy.action.HelloJspAction">
13             <result name="success">/index.jsp</result>
14         </action>
15         
16         <action name="login" class="com.Elastic.StrutsDemo1.ivy.action.LoginAction">
17             <!-- result中name的与Action中的execute()返回的值一样  -->
18             <result name="success">/success.jsp</result>
19             
20             <!-- 登录失败 -->
21             <result name="error">/error.jsp</result>
22             
23             <!-- 验证失败。不会返回validate -->
24             <result name="input">/login.jsp</result>
25         </action>
26         
27     </package>
28 </struts>


4.web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 3   <display-name>StrutsDemo1_ivy</display-name>
 4   <welcome-file-list>
 5     <welcome-file>index.html</welcome-file>
 6     <welcome-file>index.htm</welcome-file>
 7     <welcome-file>index.jsp</welcome-file>
 8     <welcome-file>default.html</welcome-file>
 9     <welcome-file>default.htm</welcome-file>
10     <welcome-file>default.jsp</welcome-file>
11   </welcome-file-list>
12  
13   <!-- 配置Struts2的核心过滤器{Controller} -->
14   <!-- 将全部请求定位到指定的Struts2过滤器中  -->
15   <filter>
16       <filter-name>Struts2</filter-name>
17       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
18   </filter>
19   <filter-mapping>
20       <filter-name>Struts2</filter-name>
21       <url-pattern>/*</url-pattern>
22   </filter-mapping>
23 </web-app>


5.index.jsp

 1 <%-- 引入JSP页面PAGE指令 --%>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8"
 3     pageEncoding="UTF-8"%>
 4 <%-- 引入JSTL标签指令 --%>
 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 6 <!DOCTYPE html>
 7 <html language="zh-CN">
 8 <head>
 9     <meta charset="utf-8">
10     <!-- 设置浏览器渲染的引擎  -->
11     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
12     <!-- 设置支持移动设备  -->
13     <meta name="viewport" content="width=device-width, initial-scale=1">
14     <title>网页标题</title>
15     <!-- 引用bootstrap样式 -->
16     <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css">
17 </head>
18 <body>
19     <!-- 从session中读取数据 -->
20     ${sessionScope.loginUser }
21     
22     ${msg }
23     <div class="container-fluid">
24         <form action="hello" method="post">
25             请输入内容:<input name="msg" type="text" />
26             请输入内容:<input name="address" type="text" />
27             <input type="submit" value="提交"/>
28         </form>
29     </div>
30     
31     <!-- 引用外部JS文件  -->
32     <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script>
33     <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script>
34 
35 </body>
36 </html>


6.LoginAction类

 1 package com.Elastic.StrutsDemo1.ivy.action;
 2 
 3 import java.util.Map;
 4 
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpSession;
 7 
 8 import org.apache.struts2.ServletActionContext;
 9 
10 import com.Elastic.StrutsDemo1.ivy.entity.User;
11 import com.opensymphony.xwork2.ActionContext;
12 import com.opensymphony.xwork2.ActionSupport;
13 //ActionSupport:数据验证    override:valid()
14 public class LoginAction extends ActionSupport{
15     /*private String userName;
16     private String userPwd;
17 
18     public String getUserName() {
19         return userName;
20     }
21 
22     public void setUserName(String userName) {
23         this.userName = userName;
24     }
25 
26     public String getUserPwd() {
27         return userPwd;
28     }
29 
30     public void setUserPwd(String userPwd) {
31         this.userPwd = userPwd;
32     }*/
33     
34     //使用hibernate框架,建实体类
35     private User user;
36 
37     public User getUser() {
38         return user;
39     }
40 
41     public void setUser(User user) {
42         this.user = user;
43     }
44 
45     /* (non-Javadoc)
46      * @see com.opensymphony.xwork2.Action#execute()
47      */
48     @Override
49     public String execute() throws Exception {
50         if ("admin".equals(user.getUserName().trim()) && "123456".equals(user.getUserPwd().trim())) {
51             //登录成功后,登录信息需要保存在session中
52             
53             //方法1.解耦方式(Map 对象)--推荐使用
54             //从ActionContext中获取session
55             Map<String, Object> session = ActionContext.getContext().getSession();
56             //以key/value形式保存数据
57             session.put("loginUser", user.getUserName());
58             
59             //方法2.耦合方式(原生Servlet API)--特殊功能
60             /*HttpServletRequest request = ServletActionContext.getRequest();
61             HttpSession session = request.getSession();
62             //setAttribute()的方式保存数据
63             session.setAttribute("loginUser", user.getUserName());*/
64             return SUCCESS;
65         }
66         return ERROR;
67     }
68 
69     @Override
70     public void validate() {
71         if (user.getUserName().trim().length() == 0) {
72             //fieldName:最好是和字段名称一致
73             this.addFieldError("userName", "用户名不能为空!");;
74         }
75     }
76 }


7.User类

 1 package com.Elastic.StrutsDemo1.ivy.entity;
 2 
 3 import java.io.Serializable;
 4 public class User implements Serializable{
 5     private String userName;
 6     private String userPwd;
 7     public String getUserName() {
 8         return userName;
 9     }
10     public void setUserName(String userName) {
11         this.userName = userName;
12     }
13     public String getUserPwd() {
14         return userPwd;
15     }
16     public void setUserPwd(String userPwd) {
17         this.userPwd = userPwd;
18     }
19 }


8.success.jsp

 1 <%-- 引入JSP页面PAGE指令 --%>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8"
 3     pageEncoding="UTF-8"%>
 4 <%-- 引入JSTL标签指令 --%>
 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 6 <!DOCTYPE html>
 7 <html language="zh-CN">
 8 <head>
 9     <meta charset="utf-8">
10     <!-- 设置浏览器渲染的引擎  -->
11     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
12     <!-- 设置支持移动设备  -->
13     <meta name="viewport" content="width=device-width, initial-scale=1">
14     <title>网页标题</title>
15     <!-- 引用bootstrap样式 -->
16     <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css">
17 </head>
18 <body>
19     
20     <div class="container-fluid">
21         <%-- <h1>${sessionScope.loginUser }登录成功</h1> --%>
22         <div class="panel panel-primary">
23             <div class="panel-heading">提示信息</div>
24             <div class="panel-body text-center">
25                 登录成功!<span id="time">10</span>秒后页面自动跳转到首页<br>
26                 如果没有跳转,请点击<a href="index.jsp">此处</a>
27             </div>
28         </div>
29     </div>
30     
31     <!-- 引用外部JS文件  -->
32     <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script>
33     <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script>
34     <script type="text/javascript">
35         var time = 10;
36         function returnPage() {
37             time --;
38             if (time <= 0) {
39                 window.location = 'index.jsp';
40             }
41             $('#time').html(time);
42         }
43         
44         $(function() {
45             window.setInterval(returnPage, 1000);
46         });
47     
48     </script>
49 </body>
50 </html>


9.error.jsp

 1 <%-- 引入JSP页面PAGE指令 --%>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8"
 3     pageEncoding="UTF-8"%>
 4 <%-- 引入JSTL标签指令 --%>
 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 6 <!DOCTYPE html>
 7 <html language="zh-CN">
 8 <head>
 9     <meta charset="utf-8">
10     <!-- 设置浏览器渲染的引擎  -->
11     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
12     <!-- 设置支持移动设备  -->
13     <meta name="viewport" content="width=device-width, initial-scale=1">
14     <title>网页标题</title>
15     <!-- 引用bootstrap样式 -->
16     <link rel="stylesheet" type="text/css" href="../css/bootstrap.min.css">
17 </head>
18 <body>
19     <div class="container-fluid">
20         <h1>登录失败</h1>
21     </div>
22     
23     <!-- 引用外部JS文件  -->
24     <script type="text/javascript" src="../js/jquery-2.2.4.js"></script>
25     <script type="text/javascript" src="../js/bootstrap.min.js"></script>
26 
27 </body>
28 </html>

   
标签:
1.将Action的错误信息在页面输出
    <%@ taglib prefix="s" uri="/struts-tags"%>
    
    常用表单标签:
        标  签                                说   明
        <s:form>…</s:form>                    表单标签
        <s:textfield>…</s:textfield >        文本输入框
        <s:password>…</s:password >            密码输入框
        <s:textarea>…</s:textarea >            文本域输入框
        <s:radio>…</s:radio >                单选按钮
        <s:checkbox>…</s:checkbox >            多选框
        <s:submit />                        提交标签
        <s:reset />                            重置标签
        <s:hidden />                        隐藏域标签

2.使用Struts 2标签在页面中实现逻辑控制
    a.使用Struts 2的通用标签
    b.条件判断标签
    c.迭代标签

    常用通用标签:
        名称                        标  签                            说   明
        条件标签                <s:if>……</s:if>                    根据表达式的值,
        判断将要执行的内容        <s:elseif>……</s:elseif>
                                <s:else>……</s:else>
        迭代                    <s:iterator>……</s: iterator >    用于遍历集合
【注意:在实际开发中为了满足用户日益多变的需求。推荐使用原生的HTML以及EL表达式和JSTL标签来完成这些功能】




















原文地址:https://www.cnblogs.com/ivy-xu/p/5618265.html