第一天:Struts2概述


MVC与Servlet

MVC三层架构

jsp + servlet + javabean开发模式剖析

缺点:
  1. 每写一个servlet,就需要在web.xml文件中配置8行,如果一个系统中servlet编写的很多,则会导致web.xml中的内容很多;

  2. 项目中很多人编辑一个web.xml文件会出现版本冲突问题;

  3. 在一个servlet中,执行url请求的方法的入口只有一个,如果servlet中写了很多的方法,这些方法应该往入口方法中传递参数,然后,在入口方法中根据每次请求的参数来判断执行哪个方法;

  4. servlet处理方法中都有两个参数request,response,这两个参数具有严重的容器依赖性,导致在servlet中写的代码是不能单独测试的;

  5. 举一个注册servlet的例子:

    RegisterServlet{
                public void doPost(HttpServletRequest request, HttpServletResponse response) {
                    1、权限判断的操作
                    2、获取表单中的数据:如果表单中封装的数据很多,在servlet中要想获得表单中的数据,
                       会产生很多的request.getParameter代码
                    3、文件上传功能实现代码
                    4、对表单上的元素进行验证
                    5、保存用户信息
                    6、返回
                }
            }

    说明:所有的处理逻辑都在一个servlet中实现,会造成处理方法中写的东西很多很杂,导致结构很乱,不容易调试与排错

  6. servlet被设计为单例对象,在一个servlet的属性中声明一个数据,会存在线程安全问题。
优点:
  1. Servlet是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键;
  2. Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点;
  3. 程序员可以对servlet进行封装,Struts2就是从servlet中封装以后得到的结果;
  4. 市场上任何一个mvc的框架都是servlet发展过来的,所以要想学好struts2这个框架,了解servlet的运行机制很关键。

重构Servlet

重构的目标

  1. 只写一个Servlet或者过滤器(我们这里选择过滤器);
  2. 不用再写任何的Servlet,这样web.xml文件中的额代码会减少很多;
  3. 原来需要写Servlet,现在只需要写action;
  4. 在action中把HttpServletRequest参数和HttpServletResponse参数传递过去;
  5. 在过滤器中通过java的反射机制调用action。

代码简单实现

(1)写一个UserAction

public class UserAction {
    public String execute(HttpServletRequest request,
            HttpServletResponse response){
        return "index.jsp";
    }
}

(2)写一个监听器ActionListener implement ServletContextListener

public class ActionListener implements ServletContextListener{
    public void contextDestroyed(ServletContextEvent arg0) {
        //在摧毁的时候,清空application域中的所有的action的配置
        arg0.getServletContext().setAttribute("actions", null);
    }
    public void contextInitialized(ServletContextEvent arg0) {
        /**
         * 1、创建一个Map
         * 2、把key,value放入到map中
         * 3、把map放入到application中
         */
        Map<String, String> map = new HashMap<String, String>();
        map.put("userAction", "cn.bin.action.UserAction");
        arg0.getServletContext().setAttribute("actions", map);
    }
}

(3)通过ActionServlet中java的反射机制进行调用

public void doGet(HttpServletRequest request,HttpServletResponse 
            response)throws ServletException, IOException {
        //1、获取url
        //2、对url进行解析,把“userAction”的部分解析出来
        //3、获取到application
        //4、从application中把Map提取出来
        //5、根据“userAction”从map中把value提取出来
        //6、利用java的反射机制进行调用
        // itcastsh08_super_servlet/userAction.action
        String uri = request.getRequestURI();
        //处理字符串得到map所需要的key值userAction
        String[] str = uri.split("/");
        String str1 = str[str.length-1];
        String actionName = str1.substring(0, str1.indexOf("."));
        //通过key值得到value值(action的类名)
        Map<String, String> map = 
                (Map<String, String>)this.getServletContext().getAttribute("actions");
        String actionClassName = map.get(actionName);
        try {
            //得到请求的action所对应的execute方法
            Class classt = Class.forName(actionClassName);
            String httprequest = "javax.servlet.http.HttpServletRequest";
            Class requestClass = Class.forName(httprequest);
            String httpresponse = "javax.servlet.http.HttpServletResponse";
            Class responseClass = Class.forName(httpresponse);
            Method method = classt.getMethod("execute", requestClass,responseClass);
            String result = 
                    (String) method.invoke(classt.newInstance(), request,response);
            request.getRequestDispatcher(result).forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

(4)web.xml的配置

<listener>
    <listener-class>cn.itcast.sh08.listener.ActionListener</listener-class>
</listener>
<servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>cn.itcast.sh08.servlet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

项目源码

Struts2介绍

Struts2是什么?

  1. struts2是apache组织发明的开源框架。是struts的第二代产品;
  2. struts2是在struts和webwork基础上整合的全新的框架;
  3. struts2的配置文件组织更合理,是企业开发很好的选择;
  4. struts2的拦截器为mvc框架注入了全新的概念。

Struts2能干什么?

  • Struts2通过简单、集中的配置来调度动作类,使得配置和修改都非常容易;
  • Struts2提供简单、统一的表达式语言来访问所有可供访问的数据;
  • Struts2提供内存式的数据中心,所有可供访问的数据都集中存放在内存中,所以在调用中不需要将数据传来传去,只要去这个内存数据中心访问即可;
  • Struts2提供在动作类执行的前或后附加执行一定功能的能力,能实现AOP;
  • Struts2提供标准的、强大的验证框架和国际化框架,而且与Struts2的其他特性紧密结合。

Struts2和MVC

前面说到Struts2是一种基于MVC的Web应用框架,上图显示了Struts是如何与MVC对应的,其中一些名词所代表的具体功能,比如前端控制器(FilterDispatcher)、动作(Action)、结果视图(Result)等,将在后边章节进行介绍。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
学校大创竞赛管理系统,学生上报项目内容,学院、教务处、评审专家评审。SpringBoot、SpringCloud、SpringSecurity、redis、Mysql、swagger、fastdfs、maven、vue、webpack.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值