自动装配

1.根据属性的getter和setter获取值

 index.jsp

<s:form action="hello" method="POST">
用户名:<s:textfield name="username"/><br>
密码<s:password name="password"/>
<s:submit value="登录"/>
</s:form>

在后台我们需要封装两个字段,字段的名字就跟文本框的name值一样即可,注意要有getter和setter方法,否则映射不到,就获取不到值

HelloAction:

public class HelloAction implements Action {

    private  String username;
private
String password; @Override
public String execute() throws Exception {
if (username.equals("1")&&password.equals("1")){
//获取session,将username保存在session
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
session.put("username",username);
return SUCCESS;
}else{
return "index";
} }
//getter和setter方法
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;
}

}

struts.xml

 <action name="hello" class="cn.struts.action.HelloAction">
<result name="index" >/index.jsp</result>
<result name="success">/main.jsp</result>
</action>

这样就可以回去前台传过来的值,输出结果

${username}

如果一个bean中的字段有很多不可能用这样的方式,所以我们将字段封装成一个bean传到后台

2.将属性封装bean传到后台

实体类:

public class User {
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;
}
}

HelloAction:

在HelloAction中,将Use实体类封装gettersetter方法,在页面中用对象.属性

 private  User user;
//1.封装成bean对象 在页面用user.属性
@Override
public String execute() throws Exception {
if (user.getUsername().equals("1")&&user.getPassword().equals("1")){
//将name值存在session中
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
session.put("username",user.getUsername());
return SUCCESS;
}else{
return "index";
} } public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}

struts.xml文件不变

 index.jsp

<s:form action="hello" method="POST">
用户名:<s:textfield name="user.username"/><br>
密码<s:password name="user.password"/>
<s:submit value="登录"/>
</s:form>

3.实现ModelDriven<T>

在Struts2中,提供了另外一种直接使用域对象的方式,就是让action实现ModelDriven接口。

ModelDriven让你可以直接操作程序中的领域对象,允许你在Web层和业务逻辑层使用相同的对象

    index.jsp

<s:form action="hello" method="POST">
用户名:<s:textfield name="username"/><br>
密码<s:password name="password"/>
<s:submit value="登录"/>
</s:form>

HelloAction2:

要实现ModelDriven就要重写getModel方法,在getModel方法中直接返回实体类对象

但是实体类对象要实体化

public class HelloAction2 implements Action,ModelDriven<User> {
private User user=new User();
//2.实现ModelDriven 要把对象实例化 页面就不用点属性 直接与实体类名字即可
@Override
public String execute() throws Exception {
if (user.getUsername().equals("2")&&user.getPassword().equals("2")){
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
session.put("username",user.getUsername());
return SUCCESS;
}else{
return "index";
} } @Override
public User getModel() {
return user;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user =
user;
}
}

struts.xml

<!--使用实现ModelModelDriven自动装配bean-->
<action name="hello2" class="cn.struts.action.HelloAction2">
<result name="index" >/index.jsp</result>
<result name="success">/main.jsp</result>
</action>

访问Servlet API

在登录的时候,我们都要讲用户存入session中,struts中没有session怎么办,所以我们要借助servlet API来创建session和request等作用域

什么是ServletAPI呢?   就是用来接收请求或发送请求使用的一些类或接口

两种方式分为解耦和耦合

一.与Servlet API解耦的访问方式

1.对Servlet API进行封装   ,借助ActionContext

提供了三个Map对象访问request、session、application作用域

通过ActionContext类获取这三个Map对象

Object get("request")  //获取request

Map getSession()   //获取session

Map getApplication()   //获取application

案例:登陆后将名称存在session

  private  User user;
//1.封装成bean对象 在页面用user.属性
@Override
public String execute() throws Exception {
if (user.getUsername().equals("1")&&user.getPassword().equals("1")){
//解耦方式1 通过ActionContext获取session
ActionContext context = ActionContext.getContext();
//在底层session也是一个map集合
Map<String, Object> session = context.getSession();
session.put("username",user.getUsername());
return SUCCESS;
}else{
return "index";
}
}

获取username

欢迎${username} 

2.实现SessionAware

向Action中注入ServletAPI对象对应的Map对象

public class Action1 implements Action,SessionAware {
//实现SessionAware 获取session
private Map<String, Object> map; @Override
public String execute() throws Exception {
map.put("uname","小花");
return SUCCESS;
} @Override
public void setSession(Map<String, Object> map) {
this.map=map;
} public Map<String, Object> getMap() {
return map;
} public void setMap(Map<String, Object> map) {
this.map = map;
}

获取结果方式

欢迎${uname}

二.与Servlet API耦合的访问方式

1.通过ActionContext的子类ServletActionContext实现

//耦合方式1  使用ServletActionContext
@Override
public String execute() throws Exception {
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("uname","小明");
return SUCCESS;
}

2.向Action实例注入Servlet API对象

实现ServletRequestAware获取request在获取session

public class Action3 implements Action,ServletRequestAware {
//耦合方式2 实现
private HttpServletRequest request; @Override
public String execute() throws Exception {
HttpSession session = request.getSession();
session.setAttribute("uname","小绿");
return SUCCESS;
} @Override
public void setServletRequest(HttpServletRequest httpServletRequest) {
this.request=httpServletRequest;
} public HttpServletRequest getRequest() {
return request;
} public void setRequest(HttpServletRequest request) {
this.request = request;
}

获取结果方式:欢迎${uname}

继承ActionSupport

实现Action必须重写Excute方法,默认执行excute方法,如果想要添加或执行别的方法怎么办,那就继承ActionSupport可以不必须重写excute方法

public class DmiAction  extends ActionSupport {

    public  String add(){
return "add";
} public String update(){
return "update";
}
}

struts.xml

   <!--一个类中有多个方法 使用method指定要指定的方法-->
<action name="dmiAction" class="cn.struts.action.DmiAction" method="add" >
<result name="add">/add.jsp</result>
</action> <action name="dmiAction" class="cn.struts.action.DmiAction" method="update">
<result name="update">/update.jsp</result>
</action>

在struts.xml中有很多action节点,即不美观又不容易理解,怎么办??

我们知道底层只能解析到struts.xml名字是固定的,想要创建多个XML文件也是可以的,需要用到 include,将其他名字的文件包含到struts.xml中,这样就可以配置多个XML文件了

1.创建其他的XML文件

2.在struts.xml中添加include节点,这样就可以配合多个文件了,但是注意的时,每个XML文件中的package的名字不一样否则会报错

<include file="struts2.xml"/>

struts.xml

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

struts.xml2

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

当继承ActionSupport的时候,我们就要配置相对的action节点,方法越多,action越多,怎么办??

这时可以动态加载页面

配置一个action,将返回的值返回不同的页面

  <!--但是一个类中有n个方法 不能配置多个action 所以使用动态访问页面-->
<!--路径加上!方法名 dmiAction!add 进入add页面 -->
<action name="dmiAction" class="cn.struts.action.DmiAction" >
<result name="add">/add.jsp</result>
<result name="update">/update.jsp</result>
</action>

在页面中使用  访问路径!方法名  就会进入不同的页面

关于Struts2自动装配和访问Servlet API的更多相关文章

  1. Struts2页面配置和访问servlet API

    一.Struts2页面配置 在struts2中页面可以分为两种,全局页面和局部页面. 1.全局页面: 在一个<package></package>标签内的多个action都要跳 ...

  2. struts2总结五: Strut2 访问Servlet API

    一.间接访问 public String execute() throws Exception { this.message="hello,this is put into applicat ...

  3. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  4. struts2访问servlet API

    搭建环境: 引入jar包,src下建立struts.xml文件 项目配置文件web.xml. web.xml: <?xml version="1.0" encoding=&q ...

  5. struts2中访问servlet API

    Struts2中的Action没有与任何Servlet API耦合,,但对于WEB应用的控制器而言,不访问Servlet API几乎是不可能的,例如需要跟踪HTTP Session状态等.Struts ...

  6. struts2的action访问servlet API的三种方法

    学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...

  7. Struts2(八)访问Servlet API

    一.Struts2中的Servlet API 1.1.struts2的Action实现了MVC中C层的作用 针对请求用户显示不同的信息 登录后段保存用户信息 ----session 保存当前在线人数等 ...

  8. 配置Struts2及Struts2访问servlet api的方式

    Struts2的起源与背景 在很长的一段时间内,在所有的MVC框架中,Struts1处于绝对的统治地位,无论是从市场的普及范围,还是具体的使用者数量. 其他MVC框架都无 法与其相比,作为一一款优秀的 ...

  9. Struts2笔记--Action访问Servlet API

    Web应用中通常需要访问的Servlet API就是HttpServletRequest.HttpSession和ServletContext,这三个接口分别代表JSP内置对象中的request.se ...

随机推荐

  1. 《linux就该这么学》第十四节课:第13章,部署DNS域名解析服务(bind服务)

    (借鉴请改动)  第十二章收尾  12.2.nfs网络文件系统 RHEL7默认安装了nfs,配置文件在  /etc/export  写入格式:共享目录    允许的客户端(参数)  ro        ...

  2. js列表添加内容清除内容,时钟

    <div id="wai"> <div id="zuo"> <select multiple="multiple&quo ...

  3. Windows上IOCP Socket事件模型管理

     1.IOCP 2.使用IOCP 1)创建完成端口CreateIoCompletionPort: 2)向完成端口添加管理句柄与管理用户数据: 3)异步发送一个管理的事件请求: 4)开启工作线程来处理I ...

  4. week1 - Python基础1 介绍、基本语法、流程控制

    知识内容: 1.python介绍 2.变量及输入输出 3.分支结构 4.循环结构 一.python介绍 Python主要应用领域: 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发 ...

  5. 浏览器对象模型BOM总结

    BOMwindows对象document对象location对象screen对象 Windows对象 1.窗口操作 移动指定的距离:window.moveBy(10,20); //向右移动10像素,向 ...

  6. CentOS6.5 切换 图形界面 与 命令行界面

    CentOS6.5 切换图形界面与命令行界面 [1]场景1:图形界面 -> 命令行界面 方式一(快捷键):Ctrl + Alt + F2 方式二(终端命令):init 3 (PS:init与3之 ...

  7. 2018-2019-2 网络对抗技术 20165316 Exp5 MSF基础应用

    2018-2019-2 网络对抗技术 20165316 Exp5 MSF基础应用 目录 原理与实践说明 实践原理 实践内容概述 基础问题回答 攻击实例 主动攻击的实践 ms08_067_netapi: ...

  8. Win10环境下 HTTP 错误 500.19 - Internal Server Error 问题及其解决方法

    记一下今日份小bug... 明天要做软件架构实验了,今天打算测试下运行web项目,于是乎,找出了以前用JSP写的web项目测试运行不了,我再打开浏览器测试Tomcat服务器,在地址栏键入http:// ...

  9. vue-loader的理解

    1.vue-loader是webpack的加载器,允许以单文件组件(SFC)的格式创作Vue组件 2.允许对Vue组件的每个部分使用其他webpack加载器 3.允许.vue文件中的自定义块可以应用自 ...

  10. 外网访问内网MariaDB数据库

    外网访问本地MariaDB数据库 本地安装了MariaDB数据库,只能在局域网内访问,怎样从公网也能访问内网MariaDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Mar ...