1. 访问Servlet API
  2. Action搜索顺序
  3. 动态方法调用
  4. 指定多个配置文件
  5. 默认Action
  6. Struts 后缀
  7. 接收参数
  8. 处理结果类型

1.访问Servlet API

  首先我们了解什么是Servlet API

  httpRequest、httpResponse、servletContext
  3个api对应jsp面向对象:request、response、application
  servlet中可以直接调用servlet api

  struts2 Action中execute没有任何参数,也就是不存在servlet api

  Struts2框架底层是基本Servlet的,所以我们肯定要去访问Servlet API,而且开发Web应用不去访问Servlet API也是不可能的,

所以我们Struts2框架提供了我们去访问Servlet API的方法;

struts2 提供了3种方式访问servlet api:

   ①:使用ServletActionContext访问Servlet API;    ActionContext类

  ②:使用ActionContext访问ServletAPI;              ServletActionCotext类

  ③:使用一些接口 如 ServletRequestAwa...;          实现***Aware接口

2.Action搜索顺序

我们来看一个路径:

我们这里新建一个student.action 没有命名空间那么我们访问的路径就是

http://localhost:8080/ProjectName(项目的名字)/student.action

那么我们改成下面的路径

http://localhost:8080/ProjectName(项目的名字)/path1/path2/path3/student.action

在浏览器中访问也能访问到正确的页面

因此我们可以看出访问的顺序是从文件的上级 也就是最后一级包开始找

http://localhost:8080/ProjectName(项目的名字)/path1/path2/path3/student.action

http://localhost:8080/ProjectName(项目的名字)/path1/path2/student.action

http://localhost:8080/ProjectName(项目的名字)/path1/student.action

http://localhost:8080/ProjectName(项目的名字)/student.action

从path3 一直到path1都找不到 最后在根目录下找到  如果找不到就会报错了

  这就是action的搜索顺序!

3.动态方法调用

  在.net MVC中 我们在Controller中创建一个一个方法  只要在页面中指定相应的mvc路径  我们视图的一个url就能请求得到

在struts中 我们则需要手工进行配置  指定页面和后台方法的匹配

  这里的动态方法调用就是为了解决一个Action对应多个请求得处理。以免Action太多(像指定method属性的配置方式  )

  动态调用有三种方式  这里指定method属性和感叹号方式(不推荐使用)不再说明   我们来说下常用的通配符方式:

首先在struts.xml配置我们的参数

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="HelloWorld2" class="com.HelloWorldAction">
<result>/result.jsp</result>
</action>
<!--
name 代表我们的action名也就是url里面的名字
class是指定我们的后台类文件
method {1} 与name中的*对应
-->
<action name="helloworld_*" method="{1}" class="com.HelloWorldAction">
<result >/result.jsp</result>
<result name="add" >/add.jsp</result>
<result name="update" >/update.jsp</result>
</action>
</package>
</struts>

这里我们需要创建三个jsp文件  默认路径的result.jsp   还有add方法的add.jsp   update方法的update.jsp

页面里面我们都用一句话简单区分  这样 启动Debug as Server 然后在浏览器中访问就可以对应到相应的路径了

这里struts.xml文件result标签值都改成{1}.jsp  一样的道理    这里可以随意加参数进行配置

4.指定多个配置文件

如果项目比较大 则需要比较多的配置  我们在入门(二)文件中看到注释可以用include来包含多个配置文件

<include file="***.xml"> </include>
<constant name="struts.i18n.encoding" value="UTF-8"> </constant>
ps:
1.被include的标签一定要符合struts的dtd规范。也就是说被include的xml文件的内部格式要符合struts的xml文件规范(跟struts.xml一摸一样)。
2.xml文件的编码格式要相同,如果是utf-8,那么都是utf-8。

5.默认Action

  默认action是为了改善用户体验,当用户输入的URL找不到对应的action,就会使用默认Action

【找不到默认action的原因和解决方法】
<default-action-ref name="index"></default-action-ref>

         <action name="index">
<result>/error.jsp</result>
</action>
<br>
<action name="log_*" method="{1}" class="com.wayne.action.LoginAction">
<result name="login">/login.jsp</result>
<result name="logout">/logout.jsp</result>
</action>

  将上面代码放到package标签中 这里定义了一个index的默认标签

通配符会覆盖掉默认action,所以不能有【*_*】这样子的action,要改成【log_*_*】这类型的命名,
否则,【*_*】里面的第一个*就包括了所有的字符,直接进入了这个action进行处理,无法进入默认的action了。

6.Struts 后缀

三种方式:

1.struts.properties中:struts.action.extension=action,do,struts2
2.struts.xml中增加常量constant:
<constant name="struts.action.extension" value="action,do,struts2"></constant>
3.在web.xml过滤器中配置intt-param参数:
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do,action,strtus2</param-value>
</init-param>

7.接收参数

  之前我们说到struts项目中  我们写了前台jsp页面  写了后台action页面  那么要想两者进行关联就需要在配置文件中配置关联关系(真是麻烦。)

下面我们用项目示例来说明下接收参数问题:

  首先我们建立一个login.jsp页面

 <%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username" />
密码:<input type="password" name="password" />
<input type="submit" value="提交"/>
</form>
</body>
</html>

然后我们创建一个后台Class   LoginAction.java

package com;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

     public String login(){
return SUCCESS;
}
}

然后我们在struts.xml配置文件中配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="HelloWorld2" class="com.HelloWorldAction">
<result>/result.jsp</result>
</action> <action name="LoginAction" method="login" class="com.LoginAction">
<result >/success.jsp</result>
</action>
</package>
</struts>

这里添加了一个过滤器 指定了访问LoginAction的login方法

然后我们如何通过action的属性获取form提交的值

第一种方式:直接在action类中实现--使用Action的属性接收参数(不利于面向对象)

 package com;

 import com.opensymphony.xwork2.ActionSupport;

 public class LoginAction extends ActionSupport {
//创建两个属性的get set方法
private String username;
private String password; public String login(){
System.out.println(username);
return SUCCESS;
} 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;
} }

然后访问:http://localhost:8080/StrutsDemo/login.jsp  输入用户名密码  提交   会发现控制台中打印输出了 用户名

第二种方式:使用DomainModel接收参数

  这里要把第一种属性声明的方式 单独放到一个类中去

  建立一个User类

  

 package com.po;

 public class User {
//创建两个属性的get set方法
private String username;
private String password; 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;
}
}

  然后action中去掉属性相关 声明一个user类

package com;

import com.opensymphony.xwork2.ActionSupport;
import com.po.User; public class LoginAction extends ActionSupport { public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} private User user; public String login(){
System.out.println(user.getUsername());
return SUCCESS;
} }

login.jsp页面中需要更改name的值

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="user.username" />
密码:<input type="password" name="user.password" />
<input type="submit" value="提交"/>
</form>
</body>
</html>

然后再次启动下  访问:http://localhost:8080/StrutsDemo/login.jsp  输入用户名密码  提交   会发现控制台中同样打印输出了 用户名

第三种方式:使用ModelDriven接收参数(推荐方式)

这里我们需要实现ModelDriven接口

package com;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.po.User; public class LoginAction extends ActionSupport
implements ModelDriven<User>{ private User user=new User(); //这里需要实例化 去掉了 get set方法 实现了ModelDriven的方法 public String login(){
System.out.println(user.getUsername());
return SUCCESS;
} @Override
public User getModel() {
// TODO Auto-generated method stub
return user;
} }

这里我们也不再需要指定jsp中的name 对象  去掉user.

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username" />
密码:<input type="password" name="password" />
<input type="submit" value="提交"/>
</form>
</body>
</html>

如果我们传递一个List方式一样的道理  在jsp中 我们声明

书籍1:<input type="text"  name="BookList[0]"/>
书籍2:<input type="text" name="BookList[1]"/>

后台User类中我们创建List   BookList对象

private List<String> BookList;
public List<String> getBookList() {
return BookList;
} public void setBookList(List<String> bookList) {
BookList = bookList;
}
这里我们就简单介绍这几种方式  最后做一个总结:
 接收参数
1,使用Action的属性接受参数,在Action中定义需要接受的属性,并写它的set/get方法。
2,使用DomainModel接受参数,创建实体类定义需要接受的属性,并set/get方法,在Action中创建实体类名属性。并在界面进行指定。
3,使用ModelDriver接受参数,在Action中实现ModelDriver<实体类名>接口,并实现方法返回当前需要转换的对象,删除set/get方法,并对 对象 进行实例化,并取消指定。
4,request
5,获取List集合中的参数。获取多个参数。 第一种接收参数的方法:直接在action类中创建相应的属性和getter和setter,和前端的name名字相同。eg:前端的username,在action类中就要建立一个private String username; Struts会自动映射为这个属性赋值 第二种接受参数的方法:使用DomainModel,将username 和password两个属性封装为一个类User(必须是标准的JavaBean),在action中声明这个属性:private User user; 同时为user设置getter和setter;在前端中的name需要设置为user.name和user.password,才能映射成功 第三种接收参数的方法:使用ModelDriven<T>接口,这个action必须实现这个接口的public T getModel()方法。此时声明的属性必须实例化,eg: private User user = new User(); 同时不需要getter和setter。前端的name也只需要写username和password就可以,不需要再加域了。这种方法时最推荐的方法,因为可以减少前后端的耦合

8.处理结果类型


我们来看一下struts.xml中过滤器的一句话

<result name="success">/result.jsp</result>  这句话等同于<result >/result.jsp</result>  说明name的默认值就是success
【Structs2处理流程】
用户请求Structs框架控制器(Action)Structs框架视图资源
返回String,提供代码复用性,有利于框架分离。
【Action中五种内置属性(com.opensymphony.xwork2.Action)】
												

Struts入门(三)深入Struts用法讲解的更多相关文章

  1. Struts 入门(一) 搭建Struts环境

    eclipse中创建项目 搭建步骤: 1.创建web项目 2.下载导入相关jar包 3.创建并完善相关配置文件 4.创建(控制器)Action 并测试启动 1.文件--新建--动态web项目 给项目起 ...

  2. (三)、Struts第三天

    (三).Struts第三天 Struts核心业务: (Struts提供了哪些功能?) 1.  请求数据自动封装(params拦截器) 2.  struts数据处理方式 * ActionContext ...

  3. Struts1.3——Struts入门

    1.Struts的几个基本概念 1.struts是一个开源框架(frameset) 2.struts是一个Web框架 3.struts是一个基于MVC的Web框架 2.为什么有struts 因为我们对 ...

  4. java web开发入门二(struts)基于eclispe

    JavaBean JavaBean,  咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提 ...

  5. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  6. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  7. C#基础入门 三

    C#基础入门 三 类 类使用class关键字进行声明,前面加一个访问修饰符,public class car{} 访问修饰符:修师傅可以用来修饰类和类成员等,控制它们的可见度 修饰符关键字分别为:pu ...

  8. redis入门(三)

    目录 redis入门(三) 目录 前言 事务 原理 Lua脚本 安装 脚本命令 集群搭建工具 redis-trib.rb redis官方集群搭建 集群横向扩展 故障转移 redis管理 参考文档 re ...

  9. IM开发者的零基础通信技术入门(三):国人通信方式的百年变迁

    [来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<中国通信的百年沉浮>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时内容有 ...

随机推荐

  1. CentOS 6 下升级安装Mysql 5.5 完整步骤

    使用系统CentOS 6.2本来已经系统自带安装了mysql 5.1,但是奈何5.1不支持utf8mb4字符集(详见:http://blog.csdn.net/shootyou/article/det ...

  2. php保存快捷方式到桌面

    /** * 保存首页到桌面 */ public function save_shortcut() { $shortcut = "[DEFAULT] BASEURL=http://www.19 ...

  3. ubuntu内窗口最大最小化

    我用的dell笔记本,开始的时候,需要修改dell笔记本的BIOS,里面有一个 Funtion Key 一开始定义的行为是多媒体的,需要改成默认行为,具体记不清了, 反正知道这个,肯定知道哪里找. 然 ...

  4. Atitit.web 视频播放器classid clsid 大总结quicktime,vlc 1. Classid的用处。用来指定播放器 1 2. <object> 标签用于包含对象,比如图像、音

    Atitit.web 视频播放器classid clsid 大总结quicktime,vlc 1. Classid的用处.用来指定播放器 1 2. <object> 标签用于包含对象,比如 ...

  5. Java线程停止interrupt()方法

    程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 中 ...

  6. mysql 索引 大于等于 走不走索引 最左前缀

    你可以认为联合索引是闯关游戏的设计 例如你这个联合索引是state/city/zipCode 那么state就是第一关 city是第二关, zipCode就是第三关 你必须匹配了第一关,才能匹配第二关 ...

  7. beans.xml的用法

    beans.xml <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="ht ...

  8. Mysql变量声明与使用

    set @today='2017-04-25';set @ydate=DATE_SUB(@today, INTERVAL 7 day);select @today, @ydate; 待续....

  9. 基于js白色简洁样式计算器

    今天给大家分享一款白色简洁样式计算器JS代码是一款精美简洁计算器JS代码插件网页特效,软件应用,后台应用JS计算器插件代码免费下载.适用浏览器:360.FireFox.Chrome.Safari.Op ...

  10. Codeforces 482C Game with Strings(dp+概率)

    题目链接:Codeforces 482C Game with Strings 题目大意:给定N个字符串,如今从中选定一个字符串为答案串,你不知道答案串是哪个.可是能够通过询问来确定, 每次询问一个位置 ...