javax.servlet.ServletException: No getter method for property Admin_Name of bean org.apache.struts.taglib.html.BEAN

本文介绍了Struts框架的基本使用方法,包括如何搭建最简单的Struts应用,以及如何在JSP页面中使用<html:form>标签。文章还详细解释了配置文件struts-config.xml中的ActionMapping和ActionForm的作用,并提供了实例说明。

Struts :

  在表单提交过程的经验:

在表单的<html:text property="managerName"></html:text>中property和FROM的对应字段名称相符合最好!!!以免出现不必要的错误++ Admin_Name->admin_Name     属性名小写  要不会出现javax.servlet.ServletException: No getter method for property Admin_Name of bean org.apache.struts.taglib.html.BEAN的错误

action 中config配置中FORM和ACTION 是一对多的对应!!

 

 

 

一下是截取http://blog.youkuaiyun.com/hotdust/archive/2007/04/26/1586343.aspx的内容  值得看

1.      在struts中,要得到一个最小化的struts是什么样的呢?
先说说这里最小化的含意。在这里,最小化就是指用struts实现一个JSP页面跳到另一个JSP页面就行。如果你想再小的话,那就只是一个strtus框架了(实现一个struts只要把各个JAR和TLD文件放到相应的LIB和WEB-INF目录中就行了)。下面说说struts这里所说的最小化结构。
最小化的struts只要实现一个Action就行,因为在struts中,ActionServlet是必须有的。ActionServlet是控制器,他要知道你要跳传的页面地址是什么,又因为在strtus架构中规范中,ActionServlet只接收的地址包装所要地址的ActionForward对像。在struts中,(据我现在所知)只有ACTION能返回ActionForward对象。所以,只要实现一个ACTION就可以了。
例:
 
 
2.      如果要实现一个在JSP页面中带有<html:form>的最小struts框架,那又是怎么样的呢?
(1)      在JSP页面中写一个<html:form></html:form>,在<html:form>的action属性设置为”/”
例: < html:form action = "/" > </ html:form >
(2)      在struts-config.xml中,写一个ActionMapping,内容如下:
< action-mappings >
           < action   path = "/" ></ action >
</ action-mappings >
(action和path属性最好写上你已经写好的Action类,这么写的原因是让些JSP可以通过编译)
(3)      接着写一个 ActionForm ,要写完整了,要不然会出错
   < form-beans >
              < form-bean name = "helloForm" type = "hello.HelloForm" >
              </ form-bean >
</ form-beans >
这时,ActionMapping也要改成:
< action-mappings >
         < action    path = "/"
                               type = ""
                              name = "helloForm" >
           </ action >
     </ action-mappings >
要不然会出错
这样,一个有<html:form>的最小strtuts就完成了。
:) 
通过上面的步骤说一说这个带<html:form>最小struts的工作流程吧。
(1)当你把带有<html:form>的JSP写完后,struts-config.xml只写上基本的头时,例: <? xml version = "1.0" encoding = "UTF-8" ?>
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd" >
< struts-config ></ struts-config >
编译器会报错:“javax.servlet.ServletException: Cannot retrieve mapping for action /”。由此可以看出,当出现一个<html:form>时,编译器首先要找的是和这个form对应的ActionMappingAction
(2)在把ActionMapping设置成
< action-mappings >
           < action   path = "/" ></ action >
</ action-mappings >
后,再进行编译JSP,编译器会报错:“ javax.servlet.ServletException: Cannot retrieve definition for form bean null”。这是因为编译器接下来想找与<html:form>对应的ActionForm,你的action中没有配置ActionForm的对象,自然就会报错。好,我们把他补上,变成:
< action-mappings >
                  < action    path = "/"
                      type = ""
                      name = "helloForm" >
                 </ action >
</ action-mappings >
(4)      这下会怎么样呢?唉,还会报错,这是为什么?因为当你在action中指定了与form相对应的ActionForm的对象后,编译自动会实例化一个你编写的ActionForm的对象,它在struts-config.xml中找不到〈form-bean〉的配置清单,所以它不能根据〈form-bean〉配置清单创建一个ActionForm的实例,就报出刚才的错误。
(5)      然后我们创建一个ActionForm,这个form要写完整了,可以没有validate方法,和reset方法,但不可以少getXxx和setXxx方法,如果少了这两个方法的话,会报错的。
 
<tr> <td class="left"> <bean:message key="GuItemPropertyDto.countyCode" /> <app:equal name="riskCode" value="120A,120B"> <font color="red">*</font></app:equal> </td> <td class="right"> <input name="InsuredGuRelatedPartyItemDistrictCode" class="codecode" type="text" style="width: 34%" value="<bean:write name='insuredGuRelatedPartyDto' property='itemDistrictCode' filter='true' />" title="<bean:write name='guInsuredPolicyRelatedPartyDto' property='itemDistrictCode' filter='true' />" ondblclick="code_CodeSelect(this,'itemDistrictCode','0,1','Y','fm.InsuredGuRelatedPartyItemCityCode[].value');" onkeyup="code_CodeSelect(this,'itemDistrictCode','0,1','Y','fm.InsuredGuRelatedPartyItemCityCode[].value');" onchange="setUpdateColor(this);code_CodeChange(this,'itemDistrictCode','0,1','Y','fm.InsuredGuRelatedPartyItemCityCode[].value');"> <input name="InsuredGuRelatedPartyItemDistrictCName" class="codename" type="text" style="width: 55%" value="<bean:write name='insuredGuRelatedPartyDto' property='itemDistrictCName' filter='true' />" title="<bean:write name='guInsuredPolicyRelatedPartyDto' property='itemDistrictCName' filter='true' />" onchange="setUpdateColor(this);"> </td> </tr> 这是RelatedPartyInsured.jsp的部分内容,相关联的还有RelatedPartyInsured_data.jsp。这部分代码用于显示itemDistrictCode 区县的信息。 报错 ]] Root cause of ServletException. javax.servlet.jsp.JspException: No getter method for property: "itemDistrictCode" of bean: "insuredGuRelatedPartyDto" at org.apache.struts.taglib.TagUtils.lookup(TagUtils.java:987) at org.apache.struts.taglib.bean.WriteTag.doStartTag(WriteTag.java:225) 应该如何解决
06-26
一、实验内容(核心需求) 1.实现简易商品管理:管理员可一次性上传商品(含名称、价格、商品图片),图片存到web/uploads目录。 2.实现用户购物车:用 Session 记录当前用户添加的商品及数量,支持查看购物车。 3.附加功能:商品图片预览、图片下载,用过滤器处理中文乱码。 4.简化设计:用内存集合模拟商品数据,前端页面简化为 3 个核心页面。 二、实验步骤及数据处理 1. 极简项目结构 src/main/java/ ├─ com/example/ │ ├─ filter/EncodingFilter.java # 编码过滤器 │ ├─ entity/Product.java # 商品实体(含图片名) │ ├─ servlet/ # 核心Servlet(仅3个) │ │ ├─ ProductServlet.java # 商品上传+列表展示 │ │ ├─ CartServlet.java # 购物车(添加+查看) │ │ └─ DownloadServlet.java # 图片下载 │ └─ util/ProductDB.java # 模拟商品数据库 web/ ├─ uploads/ # 存商品图片 ├─ productAdd.html # 上传商品页面 2. 核心代码实现 (1)编码过滤器(解决乱码,直接复用) package com.example.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") // 过滤所有请求 public class EncodingFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding("UTF-8"); // 请求编码 resp.setContentType("text/html;charset=UTF-8"); // 响应编码 chain.doFilter(req, resp); // 放行 } @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} } (2)实体类(仅保留必要属性) Product.java(商品信息 + 图片关联) (3)模拟商品数据库 (4)核心 Servlet(合并功能,减少数量) ① ProductServlet(商品上传 + 列表展示二合一) ② CartServlet(购物车:添加 + 查看二合一) ③ DownloadServlet(图片下载) (5)前端页面(HTML) ① productAdd.html(上传商品表单)
11-07
package com.example.jieba6wk.entity; import java.util.Date; public class Character { private Integer characterId; private String characterName; private String height; private String weight; private String origin; private String fightingStyle; private String coreSkill; private String difficulty; private String voiceActor; private String characterImages; // 原JSON字符串(["url"]) private String pureImageUrl; // 新增:解析后的纯URL(如 https://xxx.png) private Date updateTime; // 原有 Getter + Setter 保留,新增 pureImageUrl 的 Getter + Setter public String getPureImageUrl() { return pureImageUrl; } public void setPureImageUrl(String pureImageUrl) { this.pureImageUrl = pureImageUrl; } // 全量 Getter + Setter 方法 public Integer getCharacterId() { return characterId; } public void setCharacterId(Integer characterId) { this.characterId = characterId; } public String getCharacterName() { return characterName; } public void setCharacterName(String characterName) { this.characterName = characterName; } public String getHeight() { return height; } public void setHeight(String height) { this.height = height; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } public String getOrigin() { return origin; } public void setOrigin(String origin) { this.origin = origin; } public String getFightingStyle() { return fightingStyle; } public void setFightingStyle(String fightingStyle) { this.fightingStyle = fightingStyle; } public String getCoreSkill() { return coreSkill; } public void setCoreSkill(String coreSkill) { this.coreSkill = coreSkill; } public String getDifficulty() { return difficulty; } public void setDifficulty(String difficulty) { this.difficulty = difficulty; } public String getVoiceActor() { return voiceActor; } public void setVoiceActor(String voiceActor) { this.voiceActor = voiceActor; } public String getCharacterImages() { return characterImages; } public void setCharacterImages(String characterImages) { this.characterImages = characterImages; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } } package com.example.jieba6wk.servlet; import com.alibaba.fastjson.JSONArray; import com.example.jieba6wk.entity.Character; import com.example.jieba6wk.mapper.CharacterMapper; import com.example.jieba6wk.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; @WebServlet("/roleCategory") public class CharacterListServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); try (SqlSession sqlSession = MyBatisUtil.getSqlSession()) { CharacterMapper mapper = sqlSession.getMapper(CharacterMapper.class); List<Character> characterList = mapper.findAll(); // 关键:后端解析图片URL(将 ["url"] 转成纯URL) for (Character character : characterList) { String jsonStr = character.getCharacterImages(); if (jsonStr != null && !jsonStr.isEmpty()) { // 解析JSON数组,获取第一个元素(纯URL) JSONArray jsonArray = JSONArray.parseArray(jsonStr); if (jsonArray.size() > 0) { String pureUrl = jsonArray.getString(0); character.setPureImageUrl(pureUrl); // 存入纯URL字段 } else { character.setPureImageUrl("https://placeholder.com/default.png"); // 默认图 System.out.println("角色:" + character.getCharacterName() + ",使用默认图"); } } else { character.setPureImageUrl("https://placeholder.com/default.png"); // 默认图 System.out.println("角色:" + character.getCharacterName() + ",无图片,使用默认图"); } } request.setAttribute("characterList", characterList); request.getRequestDispatcher("/roleCategory.jsp").forward(request, response); } catch (Exception e) { System.err.println("角色列表查询失败:"); e.printStackTrace(); response.getWriter().write("服务器内部错误:" + e.getMessage()); } } } <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>街霸6角色列表</title> <style> .role-card { border: 1px solid #ccc; border-radius: 8px; padding: 15px; margin: 15px; display: inline-block; width: 280px; vertical-align: top; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .role-image { width: 100%; height: 200px; object-fit: cover; border-radius: 4px; margin-bottom: 10px; } .role-info { text-align: left; margin-bottom: 15px; } .detail-btn { padding: 8px 20px; background-color: #2c3e50; color: white; border: none; border-radius: 4px; cursor: pointer; text-decoration: none; } .detail-btn:hover { background-color: #34495e; } </style> </head> <body> <h1 style="text-align: center;">街霸6列表</h1> <c:forEach items="${characterList}" var="char"> <div class="role-card"> <!-- 直接使用后端解析好的纯URL,无复杂表达式 --> <img class="role-image" src="${char.pureImageUrl}" alt="${char.characterName}"> <div class="role-info"> <h3>${char.characterName}</h3> <p>出身:${char.origin}</p> <p>格斗风格:${char.fightingStyle}</p> <!-- 修复EL表达式条件优先级(添加括号) --> <p>难度:<span style="color: ${char.difficulty == '新手' ? 'green' : (char.difficulty == '进阶' ? 'orange' : 'red')}">${char.difficulty}</span></p> </div> <a href="/characterDetail?characterId=${char.characterId}" class="detail-btn">查看详情</a> </div> </c:forEach> </body> </html>根据以上的问题,解析以上的代码,并提出解决方案
最新发布
11-24
手把手搭建一个完整的JavaWeb项目 本案例使用Servlet+jsp制作,用Intellij Idea IDE和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。 主要功能有: 1.用户注册 2.用户登录 3.用户列表展示 4.用户信息修改 5.用户信息删除 涉及到的知识点有: 1.JDBC 2.Servlet 3.过滤器 4.EL与JSTL表达式 1.首先打开mysql数据库 新建一个数据库test,然后生成对应的表结构 CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `pwd` varchar(255) NOT NULL, `sex` varchar(255) NOT NULL, `home` varchar(255) NOT NULL, `info` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `user` VALUES ('3', '123', '123', '123', '123', '123'); INSERT INTO `user` VALUES ('4', '123123', '123123', '男', '北京', '123123'); 这里使用到了navicat for mysql 这是一种mysql的图形界面化工具,后期可以非常方便的操作数据库。 2.然后打开Intellij Idea 新建一个web项目,步骤详情见(一)。 3.在webroot下的WEB-INF下的lib中导入mysql的驱动jar包。 4.建立对应的包结构 com.javaweb.demo.filter //过滤器 解决中文字符集乱码 com.javaweb.demo.util //数据库连接工具类 com.javaweb.demo.entity //实体类 com.javaweb.demo.dao //数据操作类 com.javaweb.demo.servlet //servlet类 5.在filter下新建一个EncodingFilter类用来解决中文字符集乱码,它需要实现Filter接口,并重写doFilter函数 package com.javaweb.demo.filter; import javax.servlet.*; import java.io.IOException; public class EncodingFilter implements javax.servlet.Filter { public EncodingFilter(){ System.out.println("过滤器构造"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("过滤器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); //将编码改为utf-8 servletResponse.setContentType("text/html;charset=utf-8"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { System.out.println("过滤器销毁"); } } 6.到web.xml下进行对EncodingFilter相应的配置 整理语言保留代码,将描述语言更新一遍
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值