Struts2--day01

作者: 键盘瞎 | 来源:发表于2017-01-14 00:31 被阅读224次

非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿


记笔记啊记笔记

Struts2概述

什么是框架

框架帮我们实现一部分功能,使用框架可以省略一些代码

主流的框架

SSH Struts2、Spring、Hibernate。
其他框架:MyBatis、SpringMVC

什么是Struts2 框架

Struts2应用在web层框架,符合MVC思想

JavaEE三层结构:web层、Service层、持久化层(dao)

Struts2在Struts1和webwork框架基础上发展的全新的框架

Struts2核心功能:
1、允许POJO(Plain Old Java Object)对象作为Action
2、Action的execute方法不再与ServletAPI耦合,更易测试
3、支持更多的视图技术(JSP、FreeMarker、Velocity)
4、基于SpringAOP思想的拦截器机制,更易扩展
5、更强大、更易用输入校验机制
6、整合Ajax支持

JavaEE有三层支持

1、Web层:Struts2、Struts1
2、Service层:Spring
3、持久化层:Hibernate、mybatis

Web层框架特点

Web层有前端控制器(过滤器)

Struts2的入门案例

导入jar包

jar包

配置Struts2核心过滤器web.xml

<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>

使用的struts2提供的过滤器,不需要写,直接配置就可以

创建Action继承ActionSupport

public class  HelloAction  extends ActionSupport {
/*
 * 之前学习的servlet中,请求servlet,自动执行servlet里面service方法
 * service根据请求调用doget和dopost方法
 *  1 创建servlet:实现接口,继承类
 *  2 配置servlet访问路径 
 * 访问action时候,默认自动执行action里面名称是 execute方法
 * 配置action访问路径
 */
    public  String execute()  {
       return "success";
    }
}

配置Action的访问路径

配置文件名必须是struts.xml,必须放在src下面,xml文件需要引入dtd约束

<?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>
<!-- 配置action的访问路径 -->
<package name="hellodemo" namespace="/" extends="struts-default">
    <!-- action标签的里面的name属性是访问名称 -->
    <action name="index" class=""com.action.IndexAction>
        <result name="ok">/index.jsp</result>
    </action>
</package>
</struts>

<packname name可以随意取值 extends值是固定的struts-default namespace一般写/
<action name根据name值进行访问 Class是action的访问路径


struts.xml在Struts2的文件路径

访问action

访问action:http://localhost:8080/web/index.action

Struts2的流程分析

Struts2流程分析

Struts2配置文件的加载顺序

Struts2配置文件,由核心控制器加载StrutsPrepareAndExecuteFilter(预处理,执行过滤)

init_DefaultProperties();   //1 org/apache/struts2/default.properties
init_TraditionXmlConfigurations();  //2  struts-default.xml struts-plugin.xml struts.xml
init_LegacyStrutsProperties();  //3 自定义struts.properties
init_CustomConfigurationProvider();  // 自定义配置提供
init_FilterInitParameters();  //web.xml
init_AliasStandardObjects();  //Bean加载

default.properties 该文件保存在struts2-core-2.3.7.jar 中org.apache.struts2包里面 (常量的默认值)
struts-default.xml 该文件保存在 struts2-core-2.3.7.jar (Bean、拦截器、结果类型)
struts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jar (在插件包中存在
,配置插件信息)
struts.xml 该文件是web应用默认的struts配置文件 (实际开发中,通常写struts.xml)
struts.properties 该文件是Struts的默认配置文件 (配置常量 )
web.xml 该文件是Web应用的配置文件(配置常量)

Struts2的配置文件Struts.xml中packname配置

package类似于包,区别不同的action
name:给package起名字,不要写中文,包含特殊符号,有多个package,但是name值不能相同
extends:属性是固定的,struts-default,表示package里面具的action具有Struts2的功能
namespace:属性值和action标签的name属性值,共同构成访问地址

<!-- 配置action的访问路径 -->
<package name="hellodemo" namespace="/aa" extends="struts-default">
     <!-- action标签的里面的name属性是访问名称 -->
     <action name="index" class=""com.action.IndexAction>
          <result name="ok">/index.jsp</result>
      </action>
</package>

namespace的值是/aa
action的name值是index
访问:http://localhost:8080/HelloWorld/aa/index.action

Struts2的配置文件struts.xml中action配置

<action>元素配置默认值

元素 属性 默认值
<package> namespace /
<action> class ActionSupport类
<result> name success

配置action的访问名称,返回到路径:action标签要写到package里面,一个package里面可以有多个action配置
action配置

属性 配置
name 和package里面的namespace值,构成访问名称,可以在多个action,但是name的值不能相同
class Action的全路径,包括类路径
method 默认执行execute方法,但是可以设置执行其他的方法

result标签

返回action里面的方法返回值,配置到路径
属性 配置
name 对应action方法返回值
type 如何到路径中(转发和重定向)

路径写法强调,Action的name值不要加/

配置文件struts.xml中默认action和action默认处理类

1.如果Action的class没有配置,执行action可以访问到,默认执行的Struts2的ActionSupport,执行这个类里面的execute方法
2.如果随便输入一个地址,也执行某个action


默认action

Struts2的常量配置

struts2默认常量在default.properties中配置

default.properties路径

第一种 在src下面创建struts.properties中配置

格式要求struts.properties
格式:struts.devMode=true

第二种 在struts.xml中进行修改

常量配置

常用常量
设置表单post提交中午乱码

<constant name="struts.i18n.encoding" value="UTF-8"/>

修改struts.xml不需要重新启动服务器,自动加载

<constant name="struts.configuration.xml.reload" value="true"/>

访问struts2框架Action访问路径(扩展名)

<constant name="struts.action.extension" value="action"/>

浏览器缓存,false不缓存,true缓存,产品环境设置true、开发环设置false

<constant name="struts.serve.browserCache" value="false"/>

提供详细报错页面,修改struts.xml后不需要重启服务器

<constant name="struts.devMode" value="true"/>

第三种 在web.xml中修改

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
                <param-name>struts.i18n.encoding</param-name>
                <param-value>UTF-8</param-value>
        </init-param>
    </filter>

Struts2的配置文件struts.xml中的include配置

<include file="cn/demo/User.xml"/>

Struts2的Action三种编写方式

第一种创建普通Java类,这个类不需要实现任何接口,不继承任何类

/**
 *创建普通Java类,这个类不需要实现任何接口,不继承任何类
 /
public class UserAction{
       public String execute(){
             return "success";
       }
}

第二种创建类,实现接口,Action

创建类,实现Action接口,在Action接口里面有几个常量


常量
常量 说明
ERROR 异常
INPUT 输入数据类型不一样
LOGIN 返回登录页面
NONE 返回null
SUCCESS 成功
public class UserAction implements Action{
      public String execute() throws Exception{
            //Action接口里面的常量
            retrun SUCCESS;
      }
}

第三种创建类,基础ActionSupport(建议使用)

ActionSupport类是Action接口的实现类

public class UserAction extends Actionsupport{
      public String execute() throws Exception{
            retrun SUCCESS;
      }
}

Struts2访问action的方法

第一种方法在method属性值里面写要执行方法的名称

在action里面有method属性,在method属性里面写要执行的方法名称,比如在action里面创建add方法。缺点:每个方法都需要配置action,造成大量的action配置

<action name="dome1"  class="...." method="add"/>

第二种方法使用通配符方式配置(经常使用)

使用通配符方式配置,使用*星号,表示任意值


通配符配置
分析说明

第三种方式使用动态访问方式

1、设置常量值为true

struts.enable.DynamicMethodInvocation=true  常量值为true

配置不需要使用method属性


配置

action的name值!,执行的action的方法名称


访问路径

Struts2访问Servlet的方式

第一种方式使用类ActionContext,里面的不同方法实现

使用类ActionContext,里面的不同方法实现
1、getContext()返回ActionContext实例对象
2、getParameters()类似调用HttpServletRequest的getParameterMap()
演示一:通过表单提交数据,在action获取数值

<form action="${pageContext.request.contextPath}/servletDemo1.action" method="post">
    username:<input type="text" name="username"/>
    <br/>
    password:<input type="text" name="password"/>
    <br/>
    <input type="submit" value="提交"/>
</form>
//ActionContext的实例
ActionContext actioncontext = ActionContext.getContext();
//使用getParameters()
//返回的map集合,key是表单输入项name的属性值,value是输入的值
Map<String, Object> map = actioncontext.getParameters();
//获取到username值
//返回value值是数据形式
String[] username = (String[]) map.get("username");
//获取到password值
String[] password = (String[]) map.get("password");

System.out.println(Arrays.toString(username));
System.out.println(Arrays.toString(password));
return SUCCESS;

演示二:向三个域对象里面设置值,到jsp页面中获取三个域对象里面的值

//向request域设置值
actioncontext.put("req", "requestValue");
//向session域设置值
actionicontext.getSession().put("session", "sessionValue");
//向ServletContext域设置值
actioncontext.getApplication().put("apps", "appsvalue");

第二种方式实现不同接口,分别得到Servlet里面request、response、servletcontext对象

public class UserAction extends ActionSupport implements ServletRequestAware, ServletResponseAware{
}

第三种方式使用类ServletActionContext类里面静态方法得到request、response、servletcontext对象

static PageContext getPageContext();
static HttpServletRequest getRequest();
static HttpServletResponse getResponse();
static ServletContext getServletContext();

案例

第一步:导入jar包

jar包

第二步:配置struts2核心过滤器web.xml

<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>

第三步:配置LoginAction

package cn.itcast.login;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
       public String login() {
              //约定用户名admin 密码1314
              //获取表单数据
              HttpServletRequest  request = ServletActionContext.getRequest();
              String username = request.getParameter("username");
              String password = request.getParameter("password");
              //判断
              if("admin".equals(username) && "1314".equals(password)) {
                     return "loginsuccess";
              } else {
                     return "loginfail";
              }
       }
}

第四步:创建表单请求页面login.jsp

<%@ page language="java"  import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'form1.jsp'starting page</title>
  </head>
  <body>
    <form action="*${pageContext.request.contextPath}/person_login.action"
method="post">
       username: <input type="text"  name="username"/>
       <br/>
       password: <input type="text" name="password"/>
       <br/>
       <inputtype="submit"  value="提交"/>
    </form>
  </body>
</html>

第五步(1):和LoginAction在一个包下配置login.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>
    <!-- 修改常量 -->
    <constant name="struts.configuration.xml.reload" value="true"</constant>
    <!-- 登录的actin  -->
    <package name="login" extends="struts-default" namespace="/">
       <action name="person_*" class="cn.itcast.login.LoginAction" method="{1}">
           <result name="loginsuccess">/success.jsp</result>
           <result name="loginfail">/fail.jsp</result>
       </action>
    </package>
</struts>  

第五步(2)在用include配置到struts.xml中

<include file="cn/itcast/action/login.xml"></include>

第六步创建result的结果页面success.jsp和fail.jsp

success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
  <head>
    <title>My JSP'success.jsp' starting page</title>
  </head>
  <body>
    login success
  </body>
</html>

fail.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
  <head>
    <title>My JSP 'fail.jsp' starting page</title>
  </head>
  <body>
    login fail
  </body>
</html>

最后简单总结

1、Struts2编写Action三种方式
2、Struts2访问action的三种方式
3、Struts2访问servlet的三种方式

过去2016

在过去的几个月里,一直在维护实验室的项目,那段时间,晚上都睡在实验室,白天上课睡觉,很少来简书逛逛了,偶尔也学点东西,不过感觉还是需要一些项目来练习,否则就容易忘记。暑假也学了安卓,虽然安卓的确让我感觉到神奇,但是我还是放弃了,也就偶尔玩玩看看。

未来2017

把那些笔记文档搞定,写几个SSH或者SSM的项目,争取在暑假出去找工作之前学好,还有就是计算机设计大赛,这个看情况吧。
10月份之前把驾照考到手。

最后,再过十几个小时,我就该坐火车回家了,对那三个留在实验室的小伙伴说声对不起了,我提前跑路了。

相关文章

  • Struts2--day01

    非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿记笔记啊记笔记 Struts2概述 什么是框架 框架帮...

网友评论

    本文标题:Struts2--day01

    本文链接:https://www.haomeiwen.com/subject/bdjjbttx.html