2.Struts2_概述

news/2024/9/1 3:12:15 标签: struts

转载请注明:http://blog.csdn.net/uniquewonderq

1.struts2背景

由出色稳定的框架struts1和WebWork框架整合而来。

struts1是Apache软件基金会赞助的一个开源项目,它通过采育好难过javaservlet/jsp技术,实现了基于java ee web应用的mvc设计模式的应用框架,是mvc经典设计模式中的一个经典产品。struts1结构简单小巧,十分易用,一度市场占有率超过20%,struts1框架,与jsp/servlet耦合非常紧密,这制约了它的发展,以至于被后来的框架陆续赶超)。

(webwork是有Opensysphony组织开发的,是建立在成为xwork的command模式框架之上的强大的mvc框架,webwork晚于struts1,技术上更为先进,由于组织至猛毒,人们习惯等原因。webwork市场的反响不如struts1)

struts2与struts1差别巨大,不能理解为struts1的升级版。

struts2以xwork为核心,可以理解为webwork的升级版。

吸取了两大框架的优点

吸收了自动封装数据技术,简化了许多冗余代码

提高了开发效率和规范性

更好的实现了mvc架构

解除了与servlet的强耦合性

2.struts2的概念:

是轻量级MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。所谓轻量级,低侵入性,与业务代码的耦合度很低。即业务代码中基本不需要import它的包。struts2实现了MVC,并提供了一些列API,采用模式化方式简化业务开发过程。

MVC:M(modle)模型,它的职责是斁业务逻辑,包含两层:业务数据和业务处理逻辑。比如实体类,DAO,service都属于模型层。

V(view)视图,它的职责是负责显示界面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的jsp

C(controller)控制器,它是模型层M和视图层V之间的桥梁,用于控制流程。比如:在servlet项目中的单一控制器,ActionServlet.



3.struts2与Servlet对比

优点:

—业务代码解耦,适合团队开发

将请求分发给不同的处理类,从而降低了业务代码耦合度。

—提升开发效率

提供了一系列的API,可以大大提升项目的开发效率。如:使用拦截器自动给请求参数转型

缺点: —执行效率偏低

需要使用反射,解析XML等技术手段,会降低执行效率。

—结构复杂,有学习成本

需要花费一定成本学习struts2的API以及使用步骤

4.struts2自身的优势:

健壮性:struts2是一个成熟稳定的框架,目前比较稳定的版本是2.1.8

易用性:易学好用

扩展性:struts2运用AOP的思想,使用拦截器来扩展业务控制器Action。

侵入性:struts2对业务代码依赖性很低,基本不需要导入它的包


5.servlet与struts2实现MVC示意图

servlet实现mvc

struts2实现mvc

6.struts2框架的意义

更便捷的开发:

a.自动提交表单提交数据:属性驱动,模型驱动

b.便捷的实现上传文件:FileUpload

c.使网站通用于国内外:国际化

d.通过配置完成表单验证:校验器

e.强大的标签库:struts2标签库,OGNL标签库

更科学的管理;

a.使用xml文件管理程序文件对应关系

更安全的操作:

a.安全的线程机制:每个action都是独立的

b.防止数据重复提交:token令牌机制

先进的编程思路:

a.面向切面编程:拦截器

7.Struts2核心处理机制

使用Filter作为控制器的MVC应用实战。

下面以一个简单的实例演示一下:

首先创建一个web project

然后创建如下package 以及class

web.xml文档配置如下:

[html] view plain copy
print ?
  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <web-app version=“2.5”   
  3.     xmlns=“http://java.sun.com/xml/ns/javaee”   
  4.     xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”   
  5.     xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”>  
  7.   <display-name></display-name>   
  8.   <welcome-file-list>  
  9.     <welcome-file>index.jsp</welcome-file>  
  10.   </welcome-file-list>  
  11.     
  12.   <filter>  
  13.   <filter-name>ControlFilter</filter-name>  
  14.   <filter-class>com.filter.ControlFilter</filter-class>  
  15.   </filter>  
  16.     
  17.   <filter-mapping>  
  18.     <filter-name>ControlFilter</filter-name>  
  19.     <url-pattern>/*</url-pattern>  
  20.   </filter-mapping>  
  21. </web-app>  
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    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_2_5.xsd">
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <filter>
  <filter-name>ControlFilter</filter-name>
  <filter-class>com.filter.ControlFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>ControlFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

users.java

[java] view plain copy
print ?
  1. package com.entity;  
  2.   
  3. public class Users {  
  4.     private int id;  
  5.     private String username;  
  6.     private String password;  
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getUsername() {  
  14.         return username;  
  15.     }  
  16.     public void setUsername(String username) {  
  17.         this.username = username;  
  18.     }  
  19.     public String getPassword() {  
  20.         return password;  
  21.     }  
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  
  25.       
  26. }  
package com.entity;

public class Users {
    private int id;
    private String username;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    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;
    }

}

index.jsp

[java] view plain copy
print ?
  1. <%@ page language=“java” import=“java.util.*” pageEncoding=“utf-8”%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+”://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>  
  8. <html>  
  9.   <head>  
  10.     
  11.   </head>  
  12.     
  13.   <body>  
  14.     <a href=”register.action” >注册</a>  
  15.   </body>  
  16. </html>  
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

  </head>

  <body>
    <a href="register.action" >注册</a>
  </body>
</html>


register.jsp

[java] view plain copy
print ?
  1. <%@ page language=“java” import=“java.util.*” pageEncoding=“utf-8”%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+”://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>  
  8. <html>  
  9.   <head>  
  10.     
  11.   </head>  
  12.     
  13.   <body>  
  14.         <form action=”saveUser.action” method=“post”>  
  15.             <input type=”text” name=“username”>  
  16.             <input type=”password” name=“password”>  
  17.             <input type=”password” name=“password1”>  
  18.             <input type=”submit” name=“提交”>  
  19.         </form>  
  20.   </body>  
  21. </html>  
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

  </head>

  <body>
        <form action="saveUser.action" method="post">
            <input type="text" name="username">
            <input type="password" name="password">
            <input type="password" name="password1">
            <input type="submit" name="提交">
        </form>
  </body>
</html>


end.jsp

[java] view plain copy
print ?
  1. <%@ page language=“java” import=“java.util.*” pageEncoding=“utf-8”%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+”://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>  
  8. <html>  
  9.   <head>  
  10.     
  11.   </head>  
  12.     
  13.   <body>  
  14.     <h3>恭喜您注册成功!</h3>  
  15.   </body>  
  16. </html>  
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

  </head>

  <body>
    <h3>恭喜您注册成功!</h3>
  </body>
</html>

ControlFilter.java

[java] view plain copy
print ?
  1. package com.filter;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.xml.registry.infomodel.User;  
  13.   
  14. import com.entity.Users;  
  15.   
  16. public class ControlFilter implements Filter {  
  17.   
  18.     public void destroy() {  
  19.         // TODO Auto-generated method stub  
  20.   
  21.     }  
  22.    //核心控制器  
  23.     public void doFilter(ServletRequest request, ServletResponse response,  
  24.             FilterChain chain) throws IOException, ServletException {  
  25.         HttpServletRequest request2=(HttpServletRequest)request;  
  26.         //1.接受用户请求的地址  
  27.         String url=request2.getServletPath();  
  28.         //2.判断用户请求的地址,并执行响应的程序  
  29.         if(url.equals(“/register.action”)){  
  30.             request2.getRequestDispatcher(”register.jsp”).forward(request, response);  
  31.             return;  
  32.         }else if(url.equals(“/saveUser.action”)){  
  33.             String username=request2.getParameter(”username”);  
  34.             String password=request2.getParameter(”password”);  
  35.             String password1=request2.getParameter(”password1”);  
  36.             if(password.equals(password1)){//如果相等就封装到user对象中去  
  37.                 Users user=new Users();  
  38.                 user.setUsername(username);  
  39.                 user.setPassword(password);  
  40.                 //执行相关DAO持久化操作  
  41.                 request2.getRequestDispatcher(”end.jsp”).forward(request, response);  
  42.                 return;  
  43.                 }  
  44.             else{  
  45.                 request2.getRequestDispatcher(”register.jsp”).forward(request, response);  
  46.                 return;  
  47.                 }  
  48.               
  49.             }  
  50.         //3.跳转到相应的结果页面  
  51.         chain.doFilter(request, response);  
  52.         }     
  53.     public void init(FilterConfig filterConfig) throws ServletException {  
  54.         // TODO Auto-generated method stub  
  55.   
  56.     }  
  57.   
  58. }  
package com.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.xml.registry.infomodel.User;

import com.entity.Users;

public class ControlFilter implements Filter {

    public void destroy() {
        // TODO Auto-generated method stub

    }
   //核心控制器
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request2=(HttpServletRequest)request;
        //1.接受用户请求的地址
        String url=request2.getServletPath();
        //2.判断用户请求的地址,并执行响应的程序
        if(url.equals("/register.action")){
            request2.getRequestDispatcher("register.jsp").forward(request, response);
            return;
        }else if(url.equals("/saveUser.action")){
            String username=request2.getParameter("username");
            String password=request2.getParameter("password");
            String password1=request2.getParameter("password1");
            if(password.equals(password1)){//如果相等就封装到user对象中去
                Users user=new Users();
                user.setUsername(username);
                user.setPassword(password);
                //执行相关DAO持久化操作
                request2.getRequestDispatcher("end.jsp").forward(request, response);
                return;
                }
            else{
                request2.getRequestDispatcher("register.jsp").forward(request, response);
                return;
                }

            }
        //3.跳转到相应的结果页面
        chain.doFilter(request, response);
        }   
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}

执行结果;

首先打开index.jsp


点击注册:

填入用户信息。密码都为123.

点击提交:


细心的可以看到地址栏的变化是在我们的预期之内的。


































http://www.niftyadmin.cn/n/702492.html

相关文章

热评云厂商:银联云开启金融新科技,构建富有代表性的行业云

全球云观察《云白皮书&#xff08;2020-2021&#xff09;》热评云厂商60家之五十七 有时候&#xff0c;阿明在思考&#xff0c;一个时代总会诞生一个时代新的云。在面对行业数字化进程加速的今天&#xff0c;任何一个行业都可能诞生富有代表性的行业云&#xff0c;金融领域自然…

3.Struts2_搭建环境及实例

刚刚接触struts2&#xff0c;有点懵懵懂懂&#xff0c;还是习惯于先写代码&#xff0c;然后慢慢来理解其中的思想。 这篇文章主要内容是strusts的环境搭建及通过一个简单的例子来理解到底是怎么使用struts来简化编程的。 1.项目结构如下如&#xff0c;包括必须的包 2.web.xm…

云数据库,谁才是领导者?

2021年新冠疫情进入第二年&#xff0c;对全球的社会、经济而言是不平凡之年&#xff0c;这句话也可用于概括云数据库的发展。随着中国厂商逐步进入全球云数据库市场重要舞台&#xff0c;我们也看到一名世界级的中国高手正式亮相。 2021年Gartner云数据库管理系统魔力象限公布后…

4.Struts2_详解hellostruts

第四节是在第三节搭配环境后做的小练习。 1.项目结构如下如&#xff0c;包括必须的包 &#xff08;导入struts2.jar包&#xff0c;导入到lib目录下&#xff09; 2..web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"htt…

3.1.struts.xml中package的namespace属性

struts.xml文件中package标签除了有name、extends属性外&#xff0c;还有一个十分重要的属性&#xff1a;namespace。如下&#xff1a; <struts> <package name”struts2” extends”struts-default” namespace”/abc”> <!– 用户登录Action –> …

每周全球科技十大看点(2022.1.10-1.16)

看点摘要&#xff1a; 美光科技发布了2022财年第一季度财报&#xff0c;营收同比增长33%谷歌不仅大力拓展公有云&#xff0c;同时重金100亿美元发展云安全2021年Gartner云数据库管理系统魔力象限公布&#xff0c;国内企业仅有两家入选法国CNIL宣布对谷歌和脸书处以1.5亿欧元和…

谁说硬件设备不赚钱了?2021全年光刻机巨头ASML营收净利巨增

【全球存储观察 | 科技明说】暴利依然暴利&#xff0c;光刻机巨头依然营收净利巨增。2021全年营收超千亿元&#xff0c;净利润超400亿元。谁说硬件不赚钱了&#xff1f;关键是做什么硬件&#xff0c;是做高精尖的极紫外光刻机&#xff0c;还是做薄利多销的PC台式机&#xff0c;…

5.Struts2_Action 概述

action VS Action 类 action: 代表一个 Struts2 的请求. Action 类: 能够处理 Struts2 请求的类. 1.属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生2.必须有一个不带参的构…