SSH框架(struts2)

来源:互联网 发布:mysql系统当前时间 编辑:程序博客网 时间:2024/05/19 20:21
一.什么是struts2.
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,
Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,
是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,
这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。


二.struts2入门
   *web.xml文件配置
<!-- 配置struts2过滤器 -->
<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>
   *struts.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>
<!--package标签里面有name属性,表示名称,理论上可以随便写,namespace的值和action标签的name属性值构成访问路径 -->
<package name="demo" extends="struts-default" namespace="/">
<action name="customer_*" class="cn.itcast.action.CustomerAction" method="{1}">
<result name="list" //type=redirect或dispatcher 表示的重定向和转发操作,默认是转发>/jsp/customer/list.jsp</result>
</action>
</package>
</struts>
   *action创建
1.传统方法获取参数进行封装但要继承actionsupport
public class Data1Action extends ActionSupport {
@Override
public String execute() throws Exception {
//1 获取表单提交数据
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
//2 封装到实体类对象里面
User user = new User();
user.setUsername(username);
user.setPassword(password);
System.out.println(user);
return NONE;
}
}
2.用模型驱动进行封装
public class CustomerService implements Modeldriven<User>{
<!--模型驱动封装提交数据-->
private User user = new User();
  @Override
  public User getModel() {
return user;
  }
public string findAll() {
HttpServletRequest request = ServletActionContext.getrequest();
string username = request.getparameter("username")
  }
        }


三.如何存数据并在页面获取数据(要用值栈,也可以用传统的方式获得coke和session进行存储)
   *首先认识下action里面什么是值栈
1.之前学习过,比如在servlet把数据传递到页面中显示,在servlet里面把数据放到域对象里面,在jsp页面中使用el表达式获取域对象里面值
2.在struts2里面提供值栈,类似于域对象,值栈应用在struts2的action里面,在值栈中可以存值和取值
3.值栈存储位置
(1)servlet和action区别
&servlet默认在第一次访问时候创建,创建一次,单实例对象
&ction在访问时候,每次访问action时候都会创建一个action对象,多实例对象
(2)每次访问action时候,都会创建action对象,
在每个action对象里面存在一个值栈对象
4.值栈使用范围
 值栈使用在action范围的
5.栈
 栈就是存东西的时候后进先出,栈顶元素就是最上面的元素
   *值栈内部结构
1 值栈结构有两部分:
(1)root是list集合
    一般操作数据指的都是操作root里面数据
(2)context是map集合
    存储对象引用Context里面key名称是固定的,request、session、application、parameters、attr
2 在struts2的标签里面有一个标签可以看到值栈内部结构
(1)<s:debug>,这个标签只是在调试时候使用,点击这个超链接看到值栈结构
(2)栈顶元素是action引用
   *如何存对象
public class UserAction extends ActionSupport {
@Override
public String execute() throws Exception {
//1 获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2 ActionContext对象的方法
ValueStack stack1 = context.getValueStack();
//3 存放对象
stack.set("username", "abcdef");
//也可以用push方法
//stack.push("abcdef");
return NONE;
}
}
   *如何在页面上取对象
<s:property value="username" />
<s:property value="user.username" />
<s:property value="list[1].username" />


四.一些常用的
   *post提交中文乱码
在struts.xml里面配置<constant name="struts.i18n.encoding" value="utf-8"></constant>


   *分模块开发
<!-- 开发中可以为每个模块创建配置文件,产生很多的配置文件,最后把配置文件都引入到核心配置文件中(约束不能省略的)--> 
<include file="cn.itcast.action.CustomerAction.xml"><include>


   *全局结果页面
<global-results>
<result name="list">/jsp/customer/list.jsp</result>
</global-results>


   *自定义拦截器
1.action编写
public class CustomerAction extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
if(){
return arg0.invoke();//相当于放行
}
return "login";//相当于放行
}

}
2.xml编写
<struts>
<package name="demo" extends="struts-default" namespace="/">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="loginintercept" class="cn.lk.interceptor.LoginInterceptor"></interceptor>
</interceptors>
<action name="customer_*" class="cn.lk.action.CustomerAction" method="{1}">
<!-- 使用自定义的拦截器 -->
<interceptor-ref name="loginintercept">
<!-- 配置让action里面哪个方法不进行拦截 
param标签的name属性值 固定的: excludeMethods
在param标签里面,不进行拦截的方法名称 
-->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!-- 
使用自定义的拦截器特点:struts2默认拦截器不会执行了
               需要把默认的拦截器手动使用一次
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
 
<result name="list">/jsp/customer/list.jsp</result>
<!-- 到添加页面 -->
<result name="toAddPage">/jsp/customer/add.jsp</result>
<!-- 添加之后 -->
<result name="add">/jsp/success.jsp</result>

<!-- 登录成功 -->
<result name="loginsuccess">/index.htm</result>
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
1 0