********************************************************************************************************************

struts2第一天课程的简单配置:

新建 Web Project后导入Struts2.jar包,在struts-2.3.16.3-all.zip\struts-2.3.16.3\apps下找到struts2-blank.war,打开之后找到struts2-blank.war\WEB-INF\lib下的13个jar包.

再找到struts2-blank.war\WEB-INF\src\java下的struts.xml文件。

配置好jar包和xml文件之后:

配置web.xml里的过滤器:/*代表过滤所有

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<display-name></display-name>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

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

</web-app>

我的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.enable.DynamicMethodInvocation" value="false" />

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

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

<action name="helloWorld" class="cn.jbit.action.HelloWorldAction" >

<result name="success">index.jsp</result>

</action>

<action name="userLogin" class="cn.jbit.action.LoginAction" >

<result name="success">success.jsp</result>

<result name="error">false.jsp</result>

<result name="input">index.jsp</result>

</action>

</package>

</struts>

我的index.jsp:

<form action="userLogin.action" method="post">

请输入用户名:<input type="text" name="username">

请输入密码:<input type="text" name="pwd">

<input type="submit" value="提交">

</form>

我的action:

package cn.jbit.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {

private static final long serialVersionUID = 1L;

private String name;

private String messages;

@Override

public String execute() throws Exception {

name="wangyajie";

messages="Hellow,"+name;

return SUCCESS;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getMessages() {

return messages;

}

public void setMessages(String messages) {

this.messages = messages;

}

}

package cn.jbit.action;

import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;

import org.apache.struts2.ServletActionContext;

import org.apache.struts2.components.ActionComponent;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements SessionAware {

private static final long serialVersionUID = 1L;

public static final String SESSION_USER="user";

private String username="";

private String pwd="";

private Map<String, Object> session;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

@Override

public String execute() throws Exception {

if("jbit".equals(username)&&pwd.equals("bdqn")){

//第一种方式获取jsp的session,带作用域的session  解耦servlet

// Map<String, Object> session = ActionContext.getContext().getSession();

// session.put(SESSION_USER, username);

//第二种方式  获取serlvet的session

//     HttpSession session = ServletActionContext.getRequest().getSession();

//     session.setAttribute(SESSION_USER, username);

//第三章方式实现SessionAware接口,重写setSession方法

session.put(SESSION_USER, username);

return SUCCESS;

}

return ERROR;

}

//实现后台验证

@Override

public void validate() {

if(StringUtils.isEmpty(username)){

addFieldError("username", "用户名不能为空");

}

if(StringUtils.isEmpty(pwd)){

addFieldError("pwd", "密码不能为空");

}

super.validate();

}

@Override

public void setSession(Map<String, Object> session) {

this.session=session;

}

}

前台用struts2的表单的话。验证样式会好看点,如果使用struts2的表单的话,表单action的值不用加默认的”.action”,

<s:form action="userLogin" method="post">

<s:textfield name="username" label="用户名"></s:textfield>

<s:password name="pwd" label="密码"></s:password>

<s:submit value="登录"></s:submit>

</s:form>

在struts.xml里加上这句话的时候,默认就不是.action结尾了,提交表单的话,

Value=什么,就以什么结尾!如:

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

那么 <form action="userLogin.do" method="post">就要改成do了!

前台页面如果要显示input传入后台的值,后台只要有和前台input标签里name =“”的值相同的字段名,并且要有get和set方法,然后

前台: <s:property value="messages"/>就可以输出!

*********************************************************************************************************

struts2第二天配置详解:

首先在web.xml里要配置过滤器:

<filter>

<filter-name>struts</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

从前台的表单标签name里传的值可以直接在Action里的相同字段里取出,在Action中保存的数据都可以用${attributeName}语法访问取值,前提是所有访问的属性在Action类里的必须有get set访问器。

我Action类的配置:

package cn.jbit.action;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

public static final String SESSION_USER="user";

private static final long serialVersionUID = 1L;

private String name;

private String pwd;

private String url;

private List<Student> list;

public String show(){

System.out.println("我进来show了");

return SUCCESS;

}

public String add(){

System.out.println("我进来add方法了");

return SUCCESS;

}

public String del(){

System.out.println("我进来del方法了");

return SUCCESS;

}

public String judge(){

if(name.equals("admin")){

url="/index.jsp";

}else{

url="/error.jsp";

}

return SUCCESS;

}

public String exit(){

System.out.println("我进来exit了");

return "out";

}

@Override

public String execute() throws Exception {

if("admin".equals(name)&&"123".equals(pwd)){

list=new ArrayList<Student>();

for (int i = 0; i < 20; i++) {

list.add(new Student(i,"nameNo"+i));

}

return SUCCESS;

}

addActionError("用户不存在");

return INPUT;

}

@Override

public void validate() {

// if(StringUtils.isEmpty(name)){

// addFieldError("name", "用户名不能为空");

// }

// if(StringUtils.isEmpty(pwd)){

// addFieldError("pwd", "密码不能为空");

// }

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public List<Student> getList() {

return list;

}

public void setList(List<Student> list) {

this.list = list;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

}

Action中动态方法调用:

首先要开启:

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

地址栏后面直接加上struts.xml里的逻辑视图name!Action类里的方法如:http://localhost:8080/s2/stulist!show.action

<!--切记动态调用的时候不要加method属性 -->

<action name="stulist" class="cn.jbit.action.UserAction">

<result name="success">success.jsp</result>

</action>

通配符的方式调用方法,可是省略很多action,输入的时候如:

http://localhost:8080/s2/user_add.action

<!-- 通配符的方式调用方法要加method属性 -->

<action name="user_*" class="cn.jbit.action.UserAction" method="{1}">

<result name="success">success.jsp</result>

</action>

动态生成结果 url在类里判断

<action name="testurl_*" class="cn.jbit.action.UserAction" method="{1}">

<result name="success">${url}</result>

</action>

类里的代码为:

public String judge(){

if(name.equals("admin")){

url="/index.jsp";

}else{

url="/error.jsp";

}

return SUCCESS;

}

动态生成结果刚好和result标签里的不同返回值对应,一个是根据ACTION类的返回不同的逻辑视图名去判断进入不同页面,一个是在ACTION类里先根据控制流语句,根据不同条件判断属性赋不同地址值,然后再在返回的逻辑视图<resultname="success">${url}</result>里给出这个地址的值。

重定向到action

<action name="exit_*" class="cn.jbit.action.UserAction" method="{1}">

<result name="out" type="redirectAction">

<param name="namespace">/</param>

<param name="actionName">out</param>

</result>

</action>

<action name="out">

<result type="redirect">/index.jsp</result>

</action>

其中type的值很多,其中四个为:

redirectAction:为重定向到action

Dispatcher:转发到jsp

Chain:转发到action

Redirect:重定向到jsp

全局结果 :有些重复用的东西,比如返回error就选用全局结果

<global-results>

<result name="error">index.jsp</result>

</global-results>

进来的时候如果匹配不到这个页面路径则进入默认的提示页面 error.jsp

<default-action-ref name="others"></default-action-ref>

<action name="others">

<result>error.jsp</result>

</action>

******************************************************************************************************

struts2自定义拦截器配置:

配置自己的拦截器可以先参照下系统的拦截器是怎么配置的,首先打开struts-default.xml搜索下interceptor;系统里的拦截器有很多,拦截器都是放在堆栈里的,系统引用的是默认堆栈, <interceptor-stack name="defaultStack">;

struts2.3版本下的默认堆栈里放有19个拦截器。我们随便找一个系统拦截器,找到那个类点进去,可以看到,系统的拦截器都继承自AbstractInterceptor,知道这些,那么我们可以自己创建一个自己的拦截器了:如

package cn.jbit.Iterceptor;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 1L;

@Override

public String intercept(ActionInvocation invoc) throws Exception {

long begin=System.currentTimeMillis();

System.out.println("开始时间为:"+begin);

//拦截器和过滤器相似,都是一个链,都得有一个放行的方法,不然就没法继续进行了

String result=invoc.invoke();

//拦截器返回的结果是携带action的返回结果

System.out.println("结果为:"+result);

long end =System.currentTimeMillis();

System.out.println("结束时间为:"+end);

System.out.println("时间差为:"+(end-begin));

return result;

}

}

最后在struts.xml配置文件里的packge里加入(切记放置顺序,拦截器要放在action标签的上面):

<!-- 自己手动配置的拦截器 -->

<interceptors>

<!-- 自己的拦截器 -->

<interceptor name="myinter" class="cn.jbit.Iterceptor.MyInterceptor"></interceptor>

<!-- 把拦截器放进自己的堆栈中 -->

<interceptor-stack name="mystack">

<!-- 自己的堆栈首先引用自己的拦截器 -->

<interceptor-ref name="myinter"></interceptor-ref>

<!-- 自己的堆栈再加上系统配好的19个拦截器 -->

<interceptor-ref name="defaultStack"></interceptor-ref>

</interceptor-stack>

</interceptors>

<!-- 默认引用自己的堆栈拦截器 -->

<default-interceptor-ref name="mystack"></default-interceptor-ref>

**********************************************************************************************************

Struts2的iterator标签:

<s:iterator value="list" id="no" status="st" var=”v”>

这里的id=”no”:可以当作集合里的每个子元素,可以点出东西

<s:property value="#no.address" />

Var测试作用和id一样<s:property value="#v.address" />

返回当前迭代了几个元素:<s:property value="#st.count" />

元素索引:<s:property value="#st.index" />

<s:if test="#st.odd">

当前是奇数行

</s:if>

<s:if test="#st.even">

当前是偶数行

</s:if>

房间id :<s:property value="id" />

房间地址: <s:property value="address" />

房间类型: <s:property value="type" />

</s:iterator>

strits2初始配置总结的更多相关文章

  1. Git 笔记二-Git安装与初始配置

    git 笔记二-Git安装与初始配置 Git的安装 由于我日常生活和工作基本上都是在Windows上,因此此处只说windows上的安装.Windows上的安装和其他程序一样,只需要到http://g ...

  2. IDEA 初始配置教程

    IDEA 初始配置教程 如果你是第一次使用 IDEA,或者对 IDEA 常用配置仍然不熟悉,那么本文就特别适合你. 本文只是根据我自己的使用经验来进行配置,不一定适合所有的情况,但是对你肯定会有帮助. ...

  3. Git初始配置和基本使用

    初次运行Git前的配置 本文是在安裝完git以后首先应做到一些配置,安装教程可以参考廖雪峰git教程 用户信息 当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址. 这样做很重要,因为每 ...

  4. paloalto防火墙执行初始配置

    1.默认情况下,防火墙的 IP 地址为 192.168.1.1,用户名/密码为 admin/admin. 为了安全起见,在继续执行其他防火墙配置任务之前,必须更改这些设置.必须从 MGT 接口(即使计 ...

  5. Centos6.5 安装MYSQL 5.5 -5.6.-5.7 一键yum快速安装 ,初始配置

    Centos6.5 安装MYSQL 5.5 ---5.6---5.7 一键yum快速安装 ,初始配置 第一步:安装mysql-5.5---- 5.6 ---- 5.7的yum源 [root@sv03 ...

  6. Testlink1.9.17使用方法( 第三章 初始配置[配置用户、产品] )

    第三章 初始配置(配置用户.产品) 一. 设置用户 QQ交流群:585499566 在TestLink系统中,每个用户都可以维护自己的私有信息.admin可以创建用户,但不能看到其它用户的密码.在用户 ...

  7. [原]Jenkins(三)---Jenkins初始配置和插件配置

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5331 ...

  8. 关于思科C2950交换机清除密码,恢复初始配置的方法

    上个月河南做项目,因需要大批量的对服务器进行操作系统的安装,于是想到了PXE网络批量安装, 好不容易到机房的仓库找到网线及一台思科交换机,但到安装的时候,发现思科交换机里应该有配置了 通过配置线连接交 ...

  9. MySQL5.7初始配置

    MySQL5.7初始配置 Windows7 环境安装MySQL5.7配置命令 <<<<<<<<<<<<<<<& ...

随机推荐

  1. iOS 开发小结

    一,经历 1> 在编写以前有过的类似的新功能时,如果以前的开发人员没有写明明确的注释和开发需求,一定要仔细阅读所有代码,每一句代码都有它存在的意义. 2> 例如,只以为是[self.ful ...

  2. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  3. 华清远见金牌讲师名家大讲堂Android开发篇成功举办

    2014年3月5日.12日华清远见金牌讲师名家大讲堂(以下简称名家大讲堂)在线讲座全新升级开讲,至此拉开了新一年名家大讲堂的序幕! 华清远见名家大讲堂作为业内颇具影响力的公益免 费线上课程,自2009 ...

  4. NodeJS学习笔记之Connect中间件模块(一)

    NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...

  5. 分馅饼 Pie

    Pie 链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C 题目: Problem Description ...

  6. onselectstart

    以前在做图片滚动时,在双击左右箭头,快速切换图片滚动时,会选择附近区域的文字,感觉不是很好,今天在同事在分享时,讲到了这个问题, 试了一下,不错,解决了问题IE及Chrome下的方法一样,对相应的元素 ...

  7. Android基于XMPP的即时通讯1-基本对话

    闲暇之余,自己写了个简单的即时通讯,基于OpenFire服务器平台. 整个项目包括两个部分,一个是服务器端,一个是android手机端: 一.关于服务器端没什么好说的,下载安装配置即可 推荐下载带ja ...

  8. [CareerCup] 17.7 English Phrase Describe Integer 英文单词表示数字

    17.7 Given any integer, print an English phrase that describes the integer (e.g., "One Thousand ...

  9. EasyUI组件(窗口组件)

    注意首先要在title后面导入配置文件,前后顺序不能乱 <!-- 1.jQuery的js包 --><script type="text/javascript" s ...

  10. call与apply基础用法告诉你

    Js用法中还有个极好的但是有些抽象的用法——call与apply,今天我要简单总结一下: var ob1={ //对象ob1 name:"ob1", func1:function( ...