项目外传5

本文介绍了Struts框架的使用技巧,包括表单元素传递、批量操作实现、多条件搜索、文件上传注意事项等内容,并探讨了SQL注入风险及防范措施。

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

       1、 要记住在struts中只有属于form中的元素传递过去才可以接收到值,如我想在服务器端接收一个<td>标签中的值,但是<td>中没有name这个属性这样子我在服务器端接收值时就失败了; 当然可以采取设置隐藏文本域然后通过js的方法将得到的<td>中的值传到服务器去.....

     ————补充:

  HTML中常用的表单元素包括:文本区域(TEXTAREA),列表框(SELECT),文本输入框(INPUT type=text),密码输入框(INPUT type=password),单选输入框(INPUT type=radio),复选输入框(INPUT type=checkbox),等等。常见的非表单元素包括:链接标记(A),DIV标记,SPAN标记,TABLE标记,等等

        非表单元素是拿不到的

     2、 在查询出狗狗信息之后在其后面接一个“修改”的超链接,关于“修改”的实现有两种方式,一种是直接在dao中使用update语句, 第二种方式是根据狗狗IDX先将狗狗删除然后再添加(当然主键不变)。针对我的form表单中含有图片上传的情况使用第二种方式更好, 因为第一种方式会导致服务器存在许多已经上传了但是不会被使用的图片.......

  3、 关于批量删除或批量修改的实现:  在查询出狗狗的详细订单之后, 觉得每次一条条地删除挺费时项实现批量操作的功能。

      思路一:

        a.   一般表,多id删除---->delete from tbl where id in('1,3,7,...')
         b.   如删除了a表,同时删除b表,那么在spring--->必须将这两个dao层的方法 放到同一个 业务层 方法,用来实现事务;  
         c.   jdbc写sql,也要放到一个事务中,注意回滚! 

     思路二:

    用循环:用数组接收要删除的记录id,然后用个循环调用sql的删除语句就行了

       public int delete(String[] id)
{
String ids = "";
for (int i = 0; i < id.length; i++)
{
ids += id[i];
if(i <id.length-1)
{
    ids+=",";
}
}
String sql = "delete from table where id in ("+ids+")";

}

delete.jsp页面
String id[] = request.getParameterValues("addressId");
 

    ————提示:  支持,不过,生成ids后应该有这么一句:
ids = ids.substring(0, ids.length-1);否则,组装的sql是错误的。

     ————提示: in效率很低,基本上是不建议用的

  public int delUser(int[] userId) {
int re = 0;
String sql = null;
try {
//循环  进行删除操作
for (int i = 0; i < userId.length; i++) {
conn = this.getConn();
sql = "delete from userInfo where userID = " + userId[i];
ps = conn.prepareStatement(sql);
re = ps.executeUpdate();
}

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}

return re;
 

    思路3:  整体删除时用事物比较好

     con.setAutoCommit(false);
pstmt = con.prepareStatement(“delete from tab1 where id=?”);
for(int i=1;i <5;i++){
pstmt .setInt(1,i);
pstmt.addBatch();
}
pstmt.executeBatch();
con.commit();

 

4、 关于多条件搜索的方法, 我以前用拼接字符串的形式如select * from where 1=1 and ....之类的方式实现过, 刚又在网上看到一些方法, 思想都是一样:

        构造动态sql语句。给个sql的列子:

--1. 使用 EXEC 实现的动态参数存储过程
CREATE PROC p_test
@para1 varchar(10)=null,
@para2 varchar(10)=null,
@para3 varchar(10)=null,
@para4 varchar(10)=null
AS
SET NOCOUNT ON
DECLARE @sql varchar(8000)
SET @sql='SELECT * FROM tbname WHERE 1=1'
IF @para1 IS NOT NULL
   
SET @sql=@sql+' AND col1='''+@para1+''''
IF @para2 IS NOT NULL
   
SET @sql=@sql+' AND col2='''+@para2+''''
IF @para3 IS NOT NULL
   
SET @sql=@sql+' AND col3='''+@para3+''''
IF @para4 IS NOT NULL
   
SET @sql=@sql+' AND col4='''+@para4+''''
EXEC(@sql)
GO


/*======================================================*/

--2. 使用 sp_executesql 实现的动态参数存储过程
CREATE PROC p_test
@para1 varchar(10)=null,
@para2 datetime=null,
@para3 varchar(10)=null,
@para4 int=null
AS
SET NOCOUNT ON
DECLARE @sql nvarchar(4000)
SET @sql='SELECT * FROM tbname WHERE 1=1'
   
+CASE WHEN @para1 IS NULL THEN '' ELSE ' AND col1=@para1' END
   
+CASE WHEN @para2 IS NULL THEN '' ELSE ' AND col2=@para2' END
   
+CASE WHEN @para3 IS NULL THEN '' ELSE ' AND col3=@para3' END
   
+CASE WHEN @para4 IS NULL THEN '' ELSE ' AND col4=@para4' END
EXEC sp_executesql @sql,N'
    @para1 varchar(10)=null,
    @para2 datetime=null,
    @para3 varchar(10)=null,
    @para4 int=null
',@para1,@para2,@para3,@para4
GO


/*======================================================*/

--3. 不使用动态 Transact-SQL 语句实现的动态参数存储过程
CREATE PROC p_test
@para1 varchar(10)=null,
@para2 datetime=null,
@para3 varchar(10)=null,
@para4 int=null
AS
SET NOCOUNT ON
SELECT * FROM tbname
WHERE (@para1 IS NULL OR col1=@para1)
   
AND (@para2 IS NULL OR col2=@para2)
   
AND (@para3 IS NULL OR col3=@para3)
   
AND (@para4 IS NULL OR col4=@para4)

    ————————————我想问的是这样子不是很容易遭受SQL注入吗? 有别的更好的方法不? 如使用反射机制....思索中

  5、  <input type="file" src="xxxxxxx">此处给src赋值是不会起作用的, 不像在<img src="xxxxx">中那样子其作用

6、  今天在通过框架接收数组类型的值时遇到了问题, 后经排查原来是我前台页面一系列中的 checkbox中的value值都像 value=45  没有加引号....
      而我bean中的字符串数组被定义为String类型的.......... 当我将bean中改成int型的就可以...

    另外注意到一点就是: 将数据封装到bean中去的时候其会自动转型, 那它会自动转换成Date类型吗?
    自动转换成int类型是验证成功了吗....

7、 今天在oracle数据库中插入数据时发现了一个小小的问题:

     insert into order_form values(sysdate,1,'yao','长沙',422200,450,'已审定');  而我的最后一个字段定义为varchar2(5),结果报超过长度, 原来varchar2()中的数字代表的是字节数, 如题中为5个字节数,而3个汉字占6个字节, 所以......

8、 今天在使用那个类Struts的框架时, 由于我的form表单中有多个button, 分别为“批量删除订单”,“批量审核通过”,“批量拒绝下单”三个按钮。 我想实现的是只用一个command来接受, 然后根据接受到的button对应的value再分别做处理....

   但是经尝试, struts中得不到按钮上的值........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值