【笔记总结】struts2标签

本文详细介绍了Struts2标签的基本分类结构及其在页面元素操作中的应用,包括表单标签、非表单标签、流程控制标签、数据访问标签,并通过实例展示了如何创建实体类、Action类、配置Struts.xml文件以及使用标签实现动态级联等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struts2标签是OGNL标签

OGNL标签基本分类结构——表单标签,非表单标签,流程控制标签,数据访问标签,

表单标签:主要用于生成HTML页面,和form表单元素,以及普通表单元素的标签

非表单标签:用于生成页面的tree或者table,用的不多

流程控制标签:用于实现循环等流程的

数据访问标签:主要包含用于输出,

 

表单标签:

新建web工程,搭建struts2框架,建包com.jikexueyuan.bean写实体类

package com.jikexueyuan.bean;

public class Users{

  private id;//写一个编号

  private String username;

  private String password;

  public String getUsername() {

                  returnusername;

         }

         publicvoid setUsername(String username) {

                  this.username= username;

         }

         publicString getPassword() {

                  returnpassword;

         }

         publicvoid setPassword(String password) {

                  this.password= password;

         }

         publicint getId() {

                  returnid;

         }

         publicvoid setId(int id) {

                  this.id= id;

         }

}

建包com.jikexueyuan.action中建LoginAction.java

public class LoginAction extendsActionSupport

{

         privateUsers us;

         publicString execute()throws Exception{

                  System.out.println(us.getUsername);

                  return“success”;

         }

         publicUsers getUs()

         {

                  returnus;

         }

         publicvoid setUs(Users us)

         {

                  this.us=us;

         }

        

}

 

然后写struts.xml文件

 

然后打开index.jsp

要使用struts2的标签就要加这句,引入struts2的支持

<%@taglib prefix=”s” uri=”/struts-tags”%>其中s表示本页面中,使用struts2标签的一个简写,一般都用s来代替

 

<body>

    <!--编写表单-->这个表单同html表单很像,也有action,但是此处的action不需要加任何空间什么的,直接写struts.xml中的action 的name就可以了,也不需要加<%=path%>,也不需要加.action 或者.do了

                         当然method还是要写的

          <s:formaction="slogin" method="post">

             <s:textfield lable="用户名" name="us.username"/>编写两个输入标签,为什么此处写us, 是因为相对应于LoginAction,即提交数据的action,里面封装的对象us

             <s:password lable="密码" name="us.password"/>  lable属性是表单显示的名字,代码中不需要加:,显示页面的时候会自己加:并且两项做了自动换行,提交也做了自动换行,即struts会自动提供一些样式

                  <s:submit value="提交" />  名字没有什么变化,

 

                 

                  多选

             (1)<s:checkboxlistname=“hobby1” lable="爱好"list="{'打篮球','下棋','唱歌'}"/> list中需要给它一个集合,注意{}里为单引号,给它一个name值,name是自己命名的,这样list列表会自动显示到里面来

                 

                   这种情况下,点击页面显示源码,可以看到,value=“唱歌”显示也是唱歌

                   

                  (2)实际使用时,list中应该存的是id号而不是实际的值

                  首先要加一个#,因为这儿不是一个普通的List集合,而是Map集合

                  <s:checkboxlist name=“hobby2”lable="爱好"list="#{'1':'打篮球','2':'下棋','3':'唱歌'}"/>

                  这种情况下,点击页面显示源码,可以看到,value=“3”,显示是唱歌

                 

 

                  单选

                  <s:radio name=“hobby3”lable="爱好"list="{'打篮球','下棋','唱歌'}"/>

                  同理也可用第二种

                  <s:radio name=“hobby4”lable="爱好"list="#{'1':'打篮球','2':'下棋','3':'唱歌'}"/>

                 

                  下拉列表

                  <s:select name=“hobby5”lable="项目" list="#{'1':'篮球','2':'棋','3':'唱歌'}"/>

                  下拉列表有个属性,multiple="true"这个属性的效果是,不再下拉,都能看到,直接去选择

                 

                  多行文本块

                  <s:textarea name="xx"lable="简述"rows="22" cols="50"/>

                 

 

                  级联菜单

                  <s:doubleselect 

                     list="{'我爱西红柿','我爱番茄'}"

                     doubleList="top=='我爱西红柿'?{'斗破苍穹','xx修仙传'}:{'斗破宇宙','斗牛'}"<!--此处,top=='我爱西红柿'就是简单判定,即第一个如果显示的是“我爱西红柿,那么后面跟着的,所要级联的数据”,:后面跟着的是另一个人的信息-->

                     doubleName="作者" name=""/>

 

             <s:optiontransferselectdoubleList=""list="" doubleName=""/>

                  具体:

                   <s:optiontransferselect

                     label="喜欢的书"

                     name="cnbook"

                     leftTitle="中文书籍"

                   

                     list="#{'1':"java编程思想','2':"'企业实战'}"  以最实用的Map集合给放进去

                     listKey="key"

                     listValue="value"

                     multiple="true"

                    

                     rightTitle="英文书籍"

           headerKey="cnkey"

                     emtyOption="true";表示有空白选项

                     headerValue="请选择中文书籍"

                    

                    doubleList="#{'1':"java','2':"'J2EE'}"                

                     doubleListKey="key"

                     doubleListValue="value"

                     doubleHeaderKey="enKey"

                     doubleHeaderValue="请选择英文书籍"

                     doubleEmtyOption="true"

                     doubleMultiple="true"

                    doubleName="enbooks"/>

                    

                    

                  <s:/>

                 

          </s:form>

</body>

实例:——实现动态级联下来

package com.jikexueyuan.bean;

public class Em{//创建员工的实体类

   private int eplId;

         privateString username;

         自动生成get和set方法

         再自动完成构造方法——选择shift+alt+s,选择GenerateConstructor using field,生成完后,将super()去掉

        

}

再创建一个实体类——部门

package com.jikexueyuan.bean;

public class Dep{

         privateint dptId;

         privateString dptName;

         自动生成get和set方法

         再自动完成构造方法——选择shift+alt+s,选择GenerateConstructor using field,生成完后,将super()去掉

        

}

新建Test.jsp

<body>

 模拟,从action传递过来了request对象

 <%

     首先要创建集合对象,用来存储所有员工信息

           Map<Dep,List<Em>> map =newHashMap<Dep,List<Em>>();  key值是Dep一个部门的实体类,对应一个list集合,list里实际上就是员工Em实体类,

       模拟从数据库创建了一些数据,首先创建部门信息

                  Depde1=new Dep(1,"采购部");

                  Depde2=new Dep(2,"市场部");

                  Depde3=new Dep(3,"营销部");

                  创建集合,三个部门就有三个集合来存储各个部门相应的员工信息

                  List<Em>li1=new ArrayList<Em>();

                  List<Em>li2=new ArrayList<Em>();

                  List<Em>li3=new ArrayList<Em>();

                  再创建员工信息

                  Emem1=new Em(1,"小明");

                  Emem2=new Em(2,"小红");

                  Emem3=new Em(3,"小量");

       Em em4=new Em(4,"小最");

                  Emem5=new Em(5,"小8");

                  Emem6=new Em(6,"小3");

                  Emem7=new Em(7,"小7");

                 

将三个员工加入第一部门,再加入第二部门,第三个部门,这样三个部门就有员工信息了

                  li1.add(em1);

                  li1.add(em2);

                  li1.add(em3);

                  li2.add(em4);

                  li2.add(em5);

                  li3.add(em6);

                  li3.add(em7);

                 

                  接下来把Map集合填充起来

                  map.put(de1,li1);即部门1的员工在部门1,部门1的对象对应于list1集合

                  map.put(de2,li2);

                  map.put(de3,li3);

                  最终把map集合放到request对象当中

                  request.setAttribute("map",map);

 %>

 

    <s:doubleselect

              formName="form1"

                   lable="业务员"

                   list="#request.map.KeySet()"  注意#的意思是,从范围中找,此处是从request范围当中找map,因为放入request对象当中的是map所以此处写map

                                        .KeySet()就会把key值展示出来

                  name="depId"部门编号

                  id="comboId"

                  listKey="dptId"

                  listValue="dptName"因为list是map集合,所以按key和value

                  doubleName="eplId"

                  doubleId="comboDoubleId"

                  doubleList="#request.map[top]"

                  doubleListKey="eplId"

                  doubleListValue="username"

          />

</body>

但是注意:index.jsp中的form action不要写成login,类似于关键字,即,以后不要使用login来命名action,会出错

流程:jsp表单写入数据时,提交到sloginaction,sloginaction又跳转会index.jsp,出现了  用户名自动回填,即只用使用struts2标签,就存在值的自动回填.

逻辑控制标签

 

<%@taglib prefix=”s”uri=”/struts-tags”%>

<body>

 【1】 <!--学习<s:set>标签:作用向各种域存放一个值,值的类型可以是普通变量,scope是取值范围-->

  以下是基本数据类型的存放

  【1.1】<s:set name="age1"value="60"/>即默认写s:set的话,会向request和pageContext中放入名称为age的值,session和application都得不到的。

  这句话的意义相当于java中的<%request.setAttribute("age",60)%>

 <%=request.getAttribute("age")%><!--用来验证s:set是不是放到了request是上下文存储对象当中了-->结果直接显示在了jsp页面

 <%=pageContext.getAttribute("age")%><!--pageContext是页面集对象-->

 

  【1.2】若加入scope

  <s:set name="age2"value="60" scope="session"/>加入scope="session"后,这时session范围就能获得age的值了

 <%=session.getAttribute("age")%>

 <s:set name="age3" value="60"scope="application"/>加入scope="application"后,这时application范围就能获得age的值了

 <%=application.getAttribute("age")%>

  存放的是集合

  【1.3】<s:set name="bookList" value="{‘斗破苍穹’,'凡人修仙传',‘吞噬天空’}"/>此处的value就不是一个值了,而是一个集合,集合要用{}来表示

  展示上面的集合数据:

  展示的第一种方式

<s:select label="书籍" list=“#bookList”/>此处的list中写的内容是上面的放入request对象中的bookList

 

【1.4】存放Map集合

<s:setname=”bookMap” value=”#{‘1’:’ 斗破苍穹’,’2’:’ 凡人修仙传’,’3’:’ 吞噬天空’}”/>

注意,在放入此处要放一个#,用于区分Map和List,#{}表示{}中放的数据是Map集合形式

展示数据:

<s:select label=”书籍map” list=”#bookMap”listKey=”key”  listValue=”value”>

注意:使用Map集合的时候,展示数据时,要写listKey=”key”  listValue=”value”,也就是说,map中的key值相当于这个里面的key值

上述两种的区别:

展示页面——右键查看源文件——

List的value就是斗破苍穹

Map的value是1。此中类型比较适合于平时的应用,在我们应用到这种下拉列表时,只需从action中传递过来map集合,直接把map集合,放到

<s:select label=”书籍map” list=”#bookMaplistKey=”key”  listValue=”value”>就可以出现一个下拉列表了。不需要手动编写了。

【1.5】如何显示出这些值

<s:property value=”#age1”/>  此为默认的方式,注意#

<s:property value=”#session.age2”/>由上面可知,age2在session范围内,默认的方式是从request获取,所以,要加session. ,将范围明确告诉他

显示list集合数据

<s:property  value=”#bookList”/>  可以把集合的数据全部输出出来

显示list集合中的某一个元素,需要加[ ]

<s:property  value=”#bookList[1]”/> 展示的为下标为1的元素,list下标从0开始

如果list里为复杂数据类型,如对象,对象中才是一个具体的值

<s:property  value=”#bookList.{放具体属性}[0]”/>

显示map集合

直接打印map集合<s:property value=”#bookMap”/>

打印出所有的key值<s:property value=”#bookMap.keys”/>——即输出[1,2,3]

打印出所有的value值<s:property value=”#bookMap.values”/>——即输入[斗破苍穹,凡人修仙传,吞噬天空]

【1.6】if语句——<s:if  <s:elseif  <s:else>

<s:set name=”score” value=”80”>

<s:if test=”#score>=60”>  test里写逻辑表达式

     及格

</s:if>

<s:elseif test =”#score>30”>

     学渣

</s:elseif>

<s:else>

    学沫

</s:else>

【1.7】迭代器——用来遍历数据<s:iterator>

(1)遍历list

<s:iterator value=”#bookList” id=”bookName”>起名字叫bookName,意义是bookList中的每一项,相当于i

   <s:property value=”bookName”/>  会不停循环,把集合中的元素拿完为止

</s:iterator>

输出样式——斗破苍穹 凡人修仙传  吞噬天空

【与之前的输出结果相比,没有了[]和,】

(2)遍历Map——注意map的时候就不需要id了,因为map中有key值,通过key值遍历

<s:iteratorvalue=”#bookMap”>

<s:property value=”key”>

<s:property value=”value”><br>  br为换行

</siterator>

输出的样式为:1 斗破苍穹

              2 凡人修仙传

              3 吞噬天空

 

 

【1.8】模拟从action中传递过来一个集合,集合中是对象

<%

  List<Em>  list = new ArrayList<Em>(); 创建一个list集合

  Em em1=new Em(1,"小明");   创建员工信息

Em em2=new Em(2,"小红");

Em em3=new Em(3,"小量");

  Emem4=new Em(4,"小最");

 有了4个对象,把数据放到list集合中

list.add(em1);

list.add(em2);

list.add(em3);

list.add(em4);

最后把list集合整体放到request对象中去

request.setAttribute(“listt”,list);

 

这样就实现模拟从action传递过来一个数据list,list集合中是4个实体对象

%>

接下来用iterator对数据进行遍历展示

<s:iterator  value=”#request.listt” var=”em”>注意这里加一个request ,var 表示从集合中取出对象的小名,即取出来的对象叫em

<s:property value=”#em.eplId”/> 取对象中的id

<s:property value=”#em.username”/>再取对象中的username

</s:iterator>

显示的样式为:1 小明  2小红 3 小量 4小最

 

【1.9】看iterator还能提供什么实用功能

<s:iterator  value=”#request.listt” var=”em”

           begin=”0” 顾名思义从第几个数据开始

           end=”2”  表示0,1,2,第三个结束

           step=”2”  是隔几个跳一下,注意使用step的时候,必须加begin,不加begin写多少都是无效的

           status=”st”  用来帮助标注该行的状态问题,如迭代到第几个了,当前元素索引,以及是否是第一个元素,最后一个元素

后面对st做判断,即可以在iterator中嵌套一个判断

<s:if test=”#st.index%2==0”>  #st.index获取当前是第几行  

<br>  即#st.index%2==0如果是偶数行,则换行

</s:if>

  

    当前行号: <s:property  value=”#st.index”/>

是否是第一条:<s:property  value=”#st.first”/>  返回当前是否是第一个元素,如果是则为true,不是为false

是否是最后一条<s:property  value=”#st.last”/>返回最后一个元素

计数走到第几个(行号+1)<s:property  value=”#st.count”/>当前迭代到了第几个元素

是否是奇数行<s:property  value=”#st.odd”/>当前迭代是奇数行吗?返回true

是否是偶数行<s:property  value=”#st.even”/>当前迭代是偶数行吗?返回true

 

<s:property value=”#em.eplId”/> 取对象中的id

<s:property value=”#em.username”/>再取对象中的username

   

</s:iterator>

 

 

</body>

从interator处对集合进行筛选,是通过集合中某个对象(Em)的属性值(此处为eplId)

<s:iterator  value=”#request.listt.{?#this.eplId>2}” var=”em”>

<s:property value=”#em.eplId”/>

<s:property value=”#em.username”/>

</s:iterator>

上面可以是?也可以是$ 也可以是^

 

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值