当前位置: 首页 > 编程日记 > 正文

struts2实验2:struts2.xml action中* ,{}以及${}

p.s 关键在于struts.xml中的匹配,使用* ,{}以及${}可以让代码更加简洁清晰

代码核心思路 在struts.xml中通过路由(url)去指定控制逻辑的Action中的方法,例如

<package name="admin" namespace="/admin" extends="struts-global"><action name="login_*" class="com.zy.javaee.controller.actions.AdminLoginAction" method="{1}"><result name="success">${directUrl}</result><param name="defaultAdmin.username">testadmin</param><param name="defaultAdmin.password">123</param></action></package>
复制代码

中{1}指向login_*中的*部分, 访问/admin/login_adminLoginPage则{1}代表adminLoginPage,method={1},则路由的控制权转至AdminLoginAction.java中的adminLoginPage()方法,其次是${directUrl}指向了AdminLoginAction.jav继承的BaseAction.java中的getDirectUrl(),在AdminLoginAction.java中填充跳转页面路由即可实现由控制器控制跳转页面

普通用户登录 http://localhost:8080/users/login_userLoginPage 管理员用户登录http://localhost:8080/admin/login_adminLoginPage 默认登录 http://localhost:8080/login

<constant name="struts.i18n.encoding" value=“GBK"/> 支持中文 支持多个扩展名 设置浏览器不缓存静态内容 设置自动重新加载struts.xml

github: https://github.com/joeytsai03/javaee_test2.git

运行情况

整体的目录结构

User代码

package com.zy.javaee.domin;/*** Created by Joey_Tsai on 2018/3/9.*/
public class User {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;}private String username;private String password;}复制代码

UserLoginAction 代码

package com.zy.javaee.controller.actions;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.zy.javaee.controller.BaseAction;
import com.zy.javaee.domin.User;/*** Created by Joey_Tsai on 2018/3/19.*/
public class UserLoginAction extends BaseAction {private User user;private User defaultUser;public String userLoginPage(){setDirectUrl("/html/userLoginPage.jsp");return SUCCESS;}public String login(){if (getUser().getUsername().equals(getDefaultUser().getUsername()) && getUser().getPassword().equals(getDefaultUser().getPassword())) {ActionContext.getContext().getSession().put("user",user);setDirectUrl("/html/helloPage.jsp");return SUCCESS;} else {return userLoginPage();}}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public User getDefaultUser() {return defaultUser;}public void setDefaultUser(User defaultUser) {this.defaultUser = defaultUser;}}复制代码

LoginAction-conversion.properties

user=com.zy.javaee.UserConverter  
复制代码

userLoginPage

  Created by IntelliJ IDEA.User: Joey_TsaiDate: 2018/3/19Time: 14:14To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>普通用户登陆界面</title>
</head>
<body><a href="/login">普通用户登陆</a>
<a href="/admin/login_adminLoginPage">管理员登陆</a><h1>普通用户登陆</h1>
<s:form action="/users/login_login" method="POST"><table><tr><td><s:textfield name="user.username" label="用户名" value="testuser"/></td></tr><tr><td><s:password name="user.password" label="密码" value="123"/></td></tr><tr><td colspan="2" style="text-align: center"><s:submit value="登录"/></td></tr></table>
</s:form>
</body>
</html>复制代码

UserConverter

package com.zy.javaee;import com.zy.javaee.domin.User;
import ognl.DefaultTypeConverter;import java.util.Map;/*** Created by Joey_Tsai on 2018/3/9.*/
public class UserConverter extends DefaultTypeConverter {public Object convertValue(Map context, Object value, Class toType){/*如果是要转换成User对象*/if (toType==User.class) {/*页面传递过来的参数被封装成了String[]*/String[] params = (String[]) value;User user = new User();/*取出user字符串,按,分割成数组*/String[] uservalues = params[0].split(",");user.setUsername(uservalues[0]);user.setPassword(uservalues[1]);return user;}/*页面要显示user参数值,则要转换成字符串*/else if (toType==String.class) {User user =(User)value;return "姓名:"+user.getUsername()+", 密码:"+user.getPassword();}return null;}}复制代码

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""http://struts.apache.org/dtds/struts-2.5.dtd">
<struts><constant name="struts.i18n.encoding" value="GBK"/><constant name="struts.action.extension" value="do,action,"/><constant name="struts.serve.static.browserCache" value="false"/><constant name="struts.configuration.xml.reload" value="true"/><package name="struts-global" namespace="/" extends="struts-default"><global-results><result name="exception" >/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="exception" exception="java.lang.Exception"></exception-mapping></global-exception-mappings><action name="tryException" class="com.zy.javaee.controller.actions.ErrorProcessAction" method="tryException"><result name="success">/users/login_userLoginPage.do</result></action></package><package name="default" namespace="/" extends="struts-global"><action name="login"><result type="redirect">/users/login_userLoginPage.action</result></action></package><package name="admin" namespace="/admin" extends="struts-global"><action name="login_*" class="com.zy.javaee.controller.actions.AdminLoginAction" method="{1}"><result name="success">${directUrl}</result><param name="defaultAdmin.username">testadmin</param><param name="defaultAdmin.password">123</param></action></package><package name="users" namespace="/users" extends="struts-global"><action name="login_*" class="com.zy.javaee.controller.actions.UserLoginAction" method="{1}"><result name="success">${directUrl}</result><param name="defaultUser.username">testuser</param><param name="defaultUser.password">123</param></action></package>
</struts>
复制代码

xwork-conversion.properties

com.zy.javaee.domin.User=com.zy.javaee.UserConverter
复制代码

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><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>
复制代码

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>实验2</title>
</head>
<body>
<a href="/login">普通用户登陆</a>
<a href="/admin/login_adminLoginPage">管理员登陆</a></body>
</html>
复制代码

error.jsp

<%--Created by IntelliJ IDEA.User: Joey_TsaiDate: 2018/3/19Time: 17:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>页面错误</title>
</head>
<body><%--<s:property value="exception.message"/>--%>
<%--<s:property value="exceptionStack"/>--%>
<s:debug></s:debug>
</body>
</html>复制代码

helloPage.jsp

<%--Created by IntelliJ IDEA.User: Joey_TsaiDate: 2018/3/19Time: 14:36To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>欢迎页面</title>
</head>
<body>
<a href="/login">普通用户登陆</a>
<a href="/admin/login_adminLoginPage">管理员登陆</a><h1><s:property value="user.username"/></h1>
登陆成功!!!!
</body>
</html>
复制代码

adminLoginPage.jsp

<%--Created by IntelliJ IDEA.User: Joey_TsaiDate: 2018/3/19Time: 14:14To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>管理员登陆界面</title>
</head>
<body>
<a href="/login">普通用户登陆</a>
<a href="/admin/login_adminLoginPage">管理员登陆</a><h1>管理员登陆</h1>
<s:form action="/admin/login_login" method="POST"><table><tr><td><s:textfield name="user.username" label="用户名" value="testadmin"/></td></tr><tr><td><s:password name="user.password" label="密码" value="123"/></td></tr><tr><td colspan="2" style="text-align: center"><s:submit value="登录"/></td></tr></table>
</s:form>
</body>
</html>复制代码

AdminLoginAction

<%--Created by IntelliJ IDEA.User: Joey_TsaiDate: 2018/3/19Time: 14:14To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>管理员登陆界面</title>
</head>
<body>
<a href="/login">普通用户登陆</a>
<a href="/admin/login_adminLoginPage">管理员登陆</a><h1>管理员登陆</h1>
<s:form action="/admin/login_login" method="POST"><table><tr><td><s:textfield name="user.username" label="用户名" value="testadmin"/></td></tr><tr><td><s:password name="user.password" label="密码" value="123"/></td></tr><tr><td colspan="2" style="text-align: center"><s:submit value="登录"/></td></tr></table>
</s:form>
</body>
</html>复制代码

ErrorProcessAction

package com.zy.javaee.controller.actions;import com.opensymphony.xwork2.ActionContext;
import com.zy.javaee.controller.BaseAction;
import com.zy.javaee.domin.User;import java.sql.SQLException;/*** Created by Joey_Tsai on 2018/3/19.*/
public class ErrorProcessAction extends BaseAction {public String tryException() throws Exception {throw new Exception();}}复制代码

BaseAction

package com.zy.javaee.controller;import com.opensymphony.xwork2.ActionSupport;/*** Created by Joey_Tsai on 2018/3/19.*/
public abstract class BaseAction extends ActionSupport{private String directUrl;public String getDirectUrl() {return directUrl;}public void setDirectUrl(String directUrl) {this.directUrl = directUrl;}
}复制代码

相关文章:

【Ubuntu】dpkg-deb -c :查看deb文件中的内容

1、dpkg-deb -c :查看deb文件中的内容 $ dpkg-deb -c packageeg&#xff1a; $ dpkg-deb -c sogoupinyin_2.2.0.0108_amd64.deb drwxr-xr-x root/root 0 2018-04-18 16:50 ./ drwxr-xr-x root/root 0 2018-04-18 16:50 ./etc/ drwxr-xr-x root/root …

捕获Camera并保存图片到本地(照相功能) -samhy

Flex博文 捕获Camera并保存图片到本地(照相功能) -samhy作者:admin 日期:2010-07-12字体大小: 小 中 大捕获Camera并保存图片到本地(照相功能)这几天对Camera类进行了一下规整&#xff0c;并利用JPGEncoder类实现了照相的功能,代码如下&#xff1a; XML/HTML代码import flash.m…

【C++】模板函数的声明和定义必须在同一个文件中

1、问题描述 习惯性的将函数的定义和实现&#xff0c;分别写在头文件和源文件&#xff08;.cpp&#xff09;中。今天也按照这个习惯实现了一个模板函数。然后编译时报错 ... error: undefined reference to ...2、原因分析 c中模板的声明和定义不能分开。C中每一个对象所占用…

基于AWS-ELK部署系统日志告警系统

前言 运维故障排障速度往往与监控系统体系颗粒度成正比&#xff0c;监控到位才能快速排障 在部署这套系统之前&#xff0c;平台所有系统日志都由GraylogZabbix&#xff0c;针对日志出现的错误关键字进行告警&#xff0c;这种做法在运维工作开展过程中暴露出多个不足点&#xff…

《周志华机器学习详细公式推导版》发布,Datawhale开源项目pumpkin-book

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑来源 | Datawhale&#xff08;ID&#xff1a;Datawhale&#xff09; 如果让你推荐两本国内机器学习的入门经典作&#xff0c;你会推荐哪些呢&#xff1f;相信大家同我一样&#xff…

JVM内存泄漏检测与处理

JVM内存泄漏检测与处理&#xff08;JVM Memory Leak detection and handling&#xff09; JVM垃圾回收机制的原则和方法 JVM垃圾回收中一个基本原则是对象没有被引用或则引用其它对象&#xff0c;换句话说当一个对象在heap 中是隔离(isolation)状态的时候&#xff0c;垃圾回收器…

【Dlib】dlib和opencv的互转

一、dlib::matrix转换成cv::Mat 1、注意事项&#xff1a; 1&#xff09;将dlib::matrix转成BGR格式后&#xff0c;再转换成cv::Mat&#xff0c;因为cv::Mat中是按照BGR顺序存储 2&#xff09;注意最后添加的cv::Mat::clone()函数&#xff0c;因为dlib::toMat(tmp)返回的mat数…

原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军

原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军 02972018-04-29 16:15:27 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军 齐鲁晚报 2018年04月29日 2018年4月29日&#xff0c;山东省临沂市临沭县&#xff0c;一位年轻的小伙子。吴忠军&#xff0c;山东…

百度SLG拿下前锤子科技CTO钱晨,还要合并小鱼在家? | 极客头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑整理 | 一一出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;2016 年 7 月&#xff0c;锤子科技前 CTO 钱晨从该公司退休的消息被证实&#xff0c;关于其离职的…

【Dlib】dlib实现深度网络学习之 input层

1、 dlib::input 模板类&#xff0c;深度神经网络的简单输入层&#xff0c;它将某种图像作为输入并将其加载到网络中。 这是一个基本的输入层&#xff0c;它只是简单地将图像复制到一个张量中。 注意&#xff1a;dlib::input只支持输入dlib::matrix和dlib::array2d类型&#x…

首发 | 13篇京东CVPR 2019论文!你值得一读~ 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑编者按&#xff1a;计算机视觉和模式识别大会 CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;作为人工智能领域计算机视觉方向的重要学术会议…

Windows 活动目录(AD)服务器系统升级到2012之活动目录角色迁移(三)

4.5迁移服务器角色到AD20121. 打开powershell&#xff0c;使用命令迁移服务器角色到AD2008输入命令Ntdsutil输入命令Roles输入命令Connections输入命令Connect to server AD2012&#xff0c;连接AD2012控制器输入命令QUIT输入Transfer infrastructure master命令&#xff0c;转…

《星际争霸2》引擎技术解析

就在SIGGRAPH大会刚结束之后&#xff0c;AMD和暴雪在AMD官方网站上放出了《星际争霸II》的官方技术文档&#xff0c;通过游戏引擎技术的展示让星际迷们感受到越来越多的惊喜。画面优化给CPU带来考验着色方面&#xff0c;在使用原型的基础上利用3D Studio MAX让程序员对整体效果…

回顾与展望:大热的AutoML究竟是什么? | 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑来源 | 第四范式编者按&#xff1a;AutoML&#xff08;Automatic Machine Learning&#xff0c;自动机器学习&#xff09;旨在研究在没有专业知识的情况下使用的低门槛甚至零门槛的…

【Python】深度学习中将数据按比例随机分成随机 训练集 和 测试集的python脚本

深度学习中经常将数据分成 训练集 和 测试集&#xff0c;参考博客&#xff0c;修改python脚本 randPickAITrainTestData.py 。 功能&#xff1a;从 输入目录 中随机检出一定比例的文件或目录&#xff0c;移动到保存 测试集目录 中&#xff0c;原输入目录作为训练目录。 import…

docker 系列之 配置阿里云镜像加速器

1.登录阿里云 2.登录后找到右上角的“管理中心”,点击进入后》点击“镜像加速器”;剩下的安装文档配置就好 问题1&#xff1a;配置完后还是提示&#xff1a;Tag latest not found in repository 【本人也是在这里被困了好久,尝试了各种方法】 解决方案&#xff1a;最后发现这里…

LVM-HOWTO/学习笔记(二)

1. 在3块scsi磁盘上创建lv Run pvcreate on the disks # pvcreate /dev/sda # pvcreate /dev/sdb # pvcreate /dev/sdc Create a volume group # vgcreate my_volume_group /dev/sda /dev/sdb /dev/sdc/ Run vgdisplay to verify volume group # vgdisplay # vgdisplay…

【python】使用python脚本将LFW数据中1672组同一个人多张照片拷贝出来

使用python脚本将LFW数据中1672组同一个人多张照片拷贝出来 dataCleaning4multiple.py 源码如下&#xff1a; import os, random, shutil import sys, getopt import stringdef getDir(argv):inPath outPath num2try:opts, args getopt.getopt(argv,"hi:o:n:",[&…

EXP6 信息搜集与漏洞扫描

1.实验有关问题 &#xff08;1&#xff09;哪些组织负责DNS&#xff0c;IP的管理。 ICANN是一个集合了全球网络界商业、技术及学术各领域专家的非营利性国际组织&#xff0c;负责在全球范围内对互联网唯一标识符系统及其安全稳定的运营进行协调&#xff0c;它能决定域名和IP地址…

百度发的208亿春晚红包,靠这样的技术送到了你手上 | 解读

2019 年的春晚红包项目对百度而言是一次大考&#xff0c;背后需要强大的技术来支撑。如你所见&#xff0c;百度不负“技术大厂”的标签&#xff0c;春晚红包期间系统稳定运行&#xff0c;没有出现宕机事故。在这样一个庞大而复杂的项目面前&#xff0c;他们是如何去用技术去化解…

一步一步学Silverlight 2系列(10):使用用户控件

概述 Silverlight 2 Beta 1版本发布了&#xff0c;无论从Runtime还是Tools都给我们带来了很多的惊喜&#xff0c;如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython&#xff0c;对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlig…

何恺明的GN之后,权重标准化新方法能超越GN、BN吗? | 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | Siyuan Qiao、Huiyu Wang、Chenxi Liu、Wei Shen、Alan Yuille&#xff08;Johns Hopkins University&#xff0c;约翰霍普金斯大学&#xff09;译者 | 刘畅编辑 | Jane出品 | AI科…

【AI】CelebA数据介绍、下载及说明

1、简介 CeleA是香港中文大学的开放数据&#xff0c;包含10177个名人的202599张图片 官网&#xff1a;http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html 下载地址&#xff08;百度网盘&#xff0c;官方的&#xff09;&#xff1a;http://pan.baidu.com/s/1eSNpdRG 【python】…

Zend Framework Mail通过网易免费邮箱发送邮件

2019独角兽企业重金招聘Python工程师标准>>> 做为一个苦逼的个人站长&#xff0c;做一个小网站&#xff0c;本来愿意来看的人就不多&#xff0c;再弄一个不能找回密码的会员系统&#xff1f;基本上被判死刑了 。阿里云的短信也要钱啊&#xff0c;而且只支持PHP 5.5以…

将shp导入SDE中出现“表或视图不存在”问题

其原因是权限不够&#xff0c;下边代码可以用来检查权限是否够。 private void ESRILicense() { IAoInitialize mAoInitialize new AoInitializeClass(); esriLicenseStatus licenseStatus (esriLicenseStatus)mAoInitialize.IsProductCodeAvai…

【python】使用python脚本将CelebA中同一人的图片捡到对应单独的文件夹中

1、目的 CelebA的所有的照片都在一个文件夹中&#xff0c;为了能在dlib训练人脸识别时&#xff0c;方便使用&#xff0c;将CelebA中同一人的图片捡到对应单独的文件夹中。 【AI】CelebA数据介绍、下载及说明 2、方法 首先创建10178个目录&#xff0c;然后解析Anno/identity_…

仅用语音,AI就能“脑补”你的脸! | 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | Wav2pix 研究团队译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;【导语】之前我们为大家介绍过一项非常酸爽的研究“Talking…

如何在SAP云平台上使用MongoDB服务

首先按照我这篇文章在SAP云平台上给您的账号分配MongboDB服务&#xff1a;如何在SAP云平台的Cloud Foundry环境下添加新的Service 然后从这个链接下载SAP提供的例子程序。 1. 使用命令行 cf marketplace查看当前SAP云平台的MongoDB的版本号&#xff1a;在我使用的SAP云平台上是…

C#中将dll汇入exe,并加壳

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 1、合并file1.dll、file2.dll到destination.dll ILmerge /ndebug /target:dll /out:C:\destination.dll /log C:\file1.dll C:\file2.dll 2、合并file1.dll、file2.dll以及myApp.exe…

【AI】dlib中图像标注工具 imglab 详细说明

一、基本用法 imglab是一个在图像上标注矩形的工具。基本方法 1> 获取图片列表&#xff1a;./imglab -c mydataset.xml /tmp/images&#xff0c;/tmp/images为保存图像的文件夹 2> 标注每个图片&#xff1a;./imglab mydataset.xml&#xff0c;使用shift鼠标左键拖动来选…