zoukankan      html  css  js  c++  java
  • (一)、Struts第一天

    (一Struts第一天

    1. JavaWeb知识回顾

    客户端编程

    HTLM/CSS/JS

    XML技术

    会写XML

    基本语法

    * DTD

    * Schema

    会读XML

    * Dom4J读取XML

     

    Servlet/JSP编程

    JavaWeb开发,开发web网站!

    ServletApi !

    几个接口的用法!

    面向接口编程!

     

    数据库

    MySQL数据库!

    CRUD语法!

     

    Jdbc 编程

    JdbcApi 接口!

     

    JavaWeb增强

    过滤器、Listener、文件上传&下载、国际化、邮件!

     

     

     

    最重要的内容,

    基于MVC模式的开发!

    熟练写出CRUD案例!

     

     

    目标:

    自定义一个基于MVC模式的通用程序

    Struts2框架

     

     

     

    2. 自定义一个基于MVC模式的通用程序

    目标:项目中只要一个Servlet!处理所有请求!  (或者,只要一个过滤器!)

     

    1) MVC模式

    Model    模型     (bean/dao/service)

    View     视图     (jsp)

    Control   控制器   (servlet)

    总结:

    Servlet充当控制器!

    1. 获取请求数据封装

    2. 调用Service,处理业务逻辑操作

    3. 响应

    2) 分析

     

     

     

    3) 实现

    步骤:

    login.jsp              登陆页面

    register.jsp            注册页面

    UserService           处理登陆、注册的业务逻辑类 (tom/888)

    LoginServlet.java       

    RegisterServlet.java

     

    规则:

    登陆成功,首页!(index.jsp)

    注册成功,  

    --àlogin.jsp

    --à首页!  (注册成功,改为跳转到首页,不用改代码!怎么做?)

    优化:

    1. Servlet写一个助手类,分担servlet中业务操作

      一个Servlet,对应一个Action类!

     

     

    完整实现:(代码学员补充:)

     

     

     

     

     

     

     

     

     

     

     

     

     

    总结:

    基于MVC模式的应用程序!(小应用框架!)

      有很多种写法,且每个人写的程序都不一样!不利于项目团队合作!

    --à

    规范开发: 基于MVC模式的开发!

       (apache提供了Struts组件,简化mvc模式的项目开发!)

     

    3. Hello Struts!

    Struts版本:2.3

     

    开发步骤:

    ü 下载组件,引入jar

    www.apache.org  官网

    8

    ü 配置web.xml

    <!-- 配置Struts核心过滤器 -->

    <filter>

    <filter-name>struts2</filter-name>

    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

    <filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

     

     

    ü Action

    // Action

    public class HelloAction{

    // 处理请求代码!

    public String execute() {

    System.out.println("HelloAction.execute()");

    return "success";

    }

    public String add() {

    System.out.println("HelloAction.add()");

    return "add";

    }

    }

     

    ü 配置Action

    配置路径:src/struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

     

    <struts>

     

    <package name="test1234" extends="struts-default">

    <!-- action: 配置访问路径与处理action类的映射关系! -->

    <action name="hello" class="cn.itcast.action.HelloAction" method="execute">

    <result name="success">/index.jsp</result>

    </action>

    <!-- http://localhost:8080/day27_struts01/add -->

    <!-- http://localhost:8080/day27_struts01/add.action -->

    <action name="add" class="cn.itcast.action.HelloAction" method="add">

    <result name="add">/add.jsp</result>

    </action>

    </package>

     

    </struts>

     

     

     

    4. Struts框架

    框架

    框架,软件的半成品,项目开发,可以在框架基础上进行,提高开发效率!

    框架,

    都会预先实现一些通用功能,使用框架直接应用这些通用功能而不用重新实现!

     

    框架在项目分层中作用:

     

     

     

    Struts2框架

    ü 概念

    基于MVC模式的应用层框架技术!

    Struts2主要是通过Action动作类,处理请求!

    (与传统的servlet开发相比,只需要写Action类即可!用Action取代之前的servlet开发!)

    (Struts是对servletApi进行的封装!)

     

    Struts2功能的引入,

    是通过核心过滤器完成的!

    如果想用struts的任何功能,必须经过核心过滤器!(被过滤器拦截!)

    (struts提供的标签的访问,要先经过核心过滤器!)

     

    ü Struts2的发展

    Struts2=Struts1 + xwork

     

    源码分类:

    org.apache.struts2                 struts2核心包

    com.opensymphony.xwork2          xwork核心包

    学习版本: Strtus2.3

     

    公用组件学习方式:

    1.  下载组件源码,项目中引入jar文件!

    2.   配置

    3.   Api

     

    ü 搭建struts环境

    步骤:

    1. 引入jar

    struts2-core-2.3.4.1.jar                    struts核心功能

    xwork-core-2.3.4.1.jar                     webwork核心功能  

    ognl-3.0.5.jar                            Ognl表达式语言支持

    commons-fileupload-1.2.2.jar               struts对文件上传的支持              

    commons-io-2.0.1.jar

     

    commons-lang3-3.1.jar                   对java.lang包的扩展!     

    freemarker-2.3.19.jar                    标签库模板

    javassist-3.11.0.GA.jar                    struts对字节码处理!

     

     

     

    2. web.xml配置核心过滤器

    核心过滤器:StrutsPrepareAndExecuteFilter

    方式:

    ctrl + shift   +  R   查看工程中的源码

    ctrl + shift   +  T   查看jar文件中的源码!

     

     

    3. Action

    Struts提供了一些功能,方便开发!

    例如:文件上传、请求数据封装!

    封装请求数据,方式1

    Register.jsp

    <body>

       <form action="${pageContext.request.contextPath }/register.action" method="post">

       注册用户:<input type="text" name="userName">  <br/>

       注册密码:<input type="text" name="pwd">  <br/>

      

       <input type="submit" value="注册!">

      

       </form>

      </body>

    RegisterAction

    public class UserAction extends ActionSupport {

    // 封装请求数据,方式1

    private String userName;

         // request.getParameter(userName)

        // 把值作为方法参数传入!

    public void setUserName(String userName) {

    this.userName = userName;

    }

    private String pwd;

    public void setPwd(String pwd) {

    this.pwd = pwd;

    }

     

    @Override

    public String execute() {

    System.out.println(userName + " " + pwd);

    return "success";

    }

    }

     

     

    封装请求数据,方式2:

    注册用户:<input type="text" name="user.userName">  <br/>

       注册密码:<input type="text" name="user.pwd">  <br/>

    public class UserAction extends ActionSupport {

    // 封装请求数据,

    private User user;

    public void setUser(User user) {

    this.user = user;

    }

    // 注意:如果是基本类型只用给set方法即可;  如果是对象,必须给setget!

    public User getUser() {

    return user;

    }

    }

     

     

     

    4. 配置struts.xml, 配置action

     

    访问:

    1. struts2默认访问后缀是.action最为后缀

    2. 默认执行的方法是execute!

     

    struts.xml配置

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

     

    <struts>

     

    <!-- 

    1. package   

             作用: 管理action或管理路径的作用

       name   

        表示包名称! 作用,被其他包继承!

        <package name="base" extends="struts-default"></package>

    <package name="config" extends="base">

        包名不能重复!

       extends 

        当前包表必须继承struts-default包!

        (struts-default.xml 中定义了这个包!)

       abstract="true"

        抽象包中不能有action配置!主要被其他包继承的!

       namespace

        名称空间,管理路径!作为路径的一部分!

        默认值:/

        访问路径 namespace  + actionName

        举例:http://localhost:8080/day27_struts01/user/update.action

       

        路径匹配原则:

        http://localhost:8080/day27_struts01/user/a/b/c/update.action   OK

    http://localhost:8080/day27_struts01/user/a/b/update.action     OK

    http://localhost:8080/day27_struts01/user/a/update.action       OK

        http://localhost:8080/day27_struts01/user/update.action         OK

        http://localhost:8080/day27_struts01/a/user/update.action       NOK

       

        总结:

        localhost  本机IP

        8080       Tomcat

        /day27_struts01   通常是%tomcat%/webapps下部署项目名称!

        struts获取:

        /user/a/b/c/update.action

        截取得到:

        /user/a/b/c    名称空间部分

           去这个名称空间找action name "update" 的路径,没有,就向上一级目录查找

                    /user/a/b     去这个名称找,没有"update", 向上一层找

                    /user/a       没有

                    /user         有则返回(不往下查找!)    ; 如果没有,去默认名称空间找

                    /             没有找到,则404

     2. action 节点

      作用: 配置访问路径,与,处理action类的映射关系!

      name  

      与名称空间共同组成访问路径!

      class

      处理action类的全名!

      method

      当前请求的处理方法!

      如果不写,默认是execute!

      result 子节点

      作用: action类的业务处理方法的返回的跳转标记,与跳转页面的映射关系!

      name 

      action类中方法返回的String

      type

      表示跳转的类型! (可写值的定义,在struts-default.xml中!)

      默认是:dispatcher, 为转发!

     

      dispacher  默认值; 转发

      redirect   重定向

      标签体中可以指定跳转的页面!

     

       

     -->

    <package name="config" namespace="/user" extends="struts-default">

    <!-- 配置Action -->

    <action name="user" class="cn.itcast.b_config.UserAction" method="execute">

    <result name="success" type="redirect">/index.jsp</result>

    </action>

    </package>

    </struts>

     

     

     

    Struts2执行流程

    思考:

    Servlet类是单例还是多例? Action类?

    à servlet单例

    -à struts2action是多例!

     

    Struts1的处理请求的类是单例!struts1默认访问后缀是*.do

     

    执行流程:

     

    Tomcat服务器启动:

    过滤器:init()/doFilter()/destroy()

     

    1. 服务器启动,加载服务器自身的web.xml

    2. 同时加载部署到tomcat服务器的所有项目的web.xml

    3. 创建项目中配置的核心过滤器对象:StrutsPrepareAndExecuteFilter

    4. 执行过滤器初始化方法:init(..)

    加载下面几个配置文件:

    struts-default.xml,

    1. bean节点定义

    Struts在运行时候需要创建的关键对象,都再这里定义!

    2. package  默认的包的定义(struts-default)

    a. 跳转的结果类型

    chain            2. 转发到action

    dispatcher        1. 转发到jsp

    redirect          3.  重定向到jsp

    redirectAction     4.  重定向到 action

    stream 返回的结果是流!(文件下载!)

    转发

    1. 转发到jsp

    2. 转发到servlet

    重定向

    3.  重定向到jsp

    4.  重定向到 servlet

     

    b. 所有的拦截器的定义

    struts2把一个的功能实现,通过一个个拦截器完成!

    用户使用哪写功能,自由组装拦截器即可!

    如果没有指定,

    执行默认的拦截器,有18个!

    默认的拦截器栈:defaultStack

     

    c. 默认执行的拦截器栈、默认执行的action

     

    struts-plugin.xml,

    插件配置!

    struts.xml

    用户配置!

     

    用户访问:

    5. 执行过滤器的doFilter()方法

    6. 创建Action对象

    7. 再执行“拦截器“

    8. 再执行action的业务方法,如execute方法!

     

     

     

    Struts2数据处理

    Servlet开发:

    --àhttp请求,访问servlet

    --à 调用Service

    -à 调用dao

    --à service调用的结果,保存到域中

    ---à 响应

    -à jsp中取出域中数据! 

     

    Action开发:

    Action-àService-àdao

    Action保存结果!

     

     

    /**

     * 数据保存到域?

     * |-- ActionContext

     *  |-- ServletActionContext

     */

    public String execute() throws Exception {

    // 方式1:获取原始的ServletApi, 把数据保存到域!

    HttpServletRequest request = ServletActionContext.getRequest();

    HttpSession session =  request.getSession();

    ServletContext sc = ServletActionContext.getServletContext();

    // 保存

    request.setAttribute("data""request_data");

    session.setAttribute("data""session_data");

    sc.setAttribute("data""application_data");

    return "success";

    }

     

     

     

     

     

    // 方式2: 通过ActionContext操作

    // 注意:strutsrequest/session/application这些域对象,

    // 封装为一个个的map,我们就可以通过操作map来操作域对象!

    public String execute() throws Exception {

    // 获取ActionContext对象

    ActionContext ac = ActionContext.getContext();

    // 获取表示requestmap

    //Map<String,Object> request = (Map<String, Object>) ac.get("request");

    Map<String,Object> request = ac.getContextMap();

    // 获取表示sessionmap

    //Map<String,Object> session = (Map<String, Object>) ac.get("session");

    Map<String,Object> session =  ac.getSession();

    // 获取表示applicationmap

    //Map<String,Object> application = (Map<String, Object>) ac.get("application");

    Map<String,Object> application = ac.getApplication();

    // 放数据到域对象

    request.put("data""request_data11");

    session.put("data""session_data21");

    application.put("data""application_data31");

    return "success";

    }

     

     

    总结:

    项目中尽量使用解耦的方式操作数据:ActionContext!

        当ActionContext 满足不了需求,再用ServletActionContext





  • 相关阅读:
    一、第一个小程序
    Golang学习笔记
    第四章 自上而下分析
    个人vim配置
    第三章 词法分析
    3.7 TCP拥塞控制
    3.6 拥塞控制原理
    3.5 面向连接的运输:TCP
    3.4可靠数据传输的原理
    3.3 无连接运输:UDP
  • 原文地址:https://www.cnblogs.com/dantefung/p/4830556.html
Copyright © 2011-2022 走看看