Struts2--day01

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


记笔记啊记笔记

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月份之前把驾照考到手。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,277评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,777评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,946评论 0 245
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,271评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,636评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,767评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,989评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,733评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,457评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,674评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,155评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,518评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,160评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,114评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,898评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,822评论 2 280
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,705评论 2 273

推荐阅读更多精彩内容

  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,182评论 0 50
  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入门3、Struts 2 的执行流程4、配置 st...
    廖少少阅读 2,904评论 3 13
  • Struts2_day01 Struts2课程安排 第一天 struts2 入门 2017年10月27日 第二天 ...
    暖熊熊阅读 293评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,296评论 18 399
  • 一个美国男孩上完了中学,需要去服兵役了,他非常的害怕,害怕的睡不着觉,吃不下饭。面对这个问题,父母不知道如何开解他...
    爱家心理阅读 3,333评论 0 2