一个Java码农眼中的技术世界Java后端程序员

【SSH】bug解决记录

2019-04-23  本文已影响3人  大数据阶梯之路

一、访问不了static下的静态资源

这是因为struts2在web.xml中配置核心拦截器的时候把所有请求都拦截了,这也就包括静态资源。

图片.png 所以我们只需在struts2.xml文件中配置一句声明不拦截static对文件夹下的请求即可,还有路径记得写对,例如static/css/index.css
<constant name="struts.action.excludePattern" value="/static/.*?" />

二、struts2.5最新jar包版本配置搭建

struts2常用jar包就这几个,直接官网找最新的下载。


图片.png

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SSHDemo02</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

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>
        <!--开启action动态访问  -->
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
        <!-- 不拦截对static文件夹下的请求 -->
        <constant name="struts.action.excludePattern" value="/static/.*?" />
        <package name="default" extends="struts-default" namespace="/" strict-method-invocation="false">
            <!-- 定义各个action配置 -->
                ......  
        </package>
    </struts>

三、切记,hql语句针对的实体类对象,而不是表结构

图片.png

四、使用hibernate在插入数据时报错:attempt to create saveOrUpdate event with null entity

此时要检查你的实体类对象是否注入了,即是否为空对象,如果是空对象自然就无法插入了。可在调用session.save(users)插入数据之前打印下users对象,看是否为空。我遇到的是修改了User实体类的名字,然后没有生成重新getter和setter方法导致属性没注入进去users成为空对象。

五、引入struts2的日历控件datetimepicker,出现九月开始之后的月份就乱码

解决的办法,是打开dojo-plugin.jar包里dojo-zh.jsdojo-zh-cn.js文件,修改之后再保存为UTF-8格式的文件:https://blog.csdn.net/cswhale/article/details/7907107

六、hibernate进行分页查询时报错:ERROR: 只进结果集不支持请求的操作。

图片.png

出现这种问题是由于在hibernate-cfg.xml配置文件中没有配置结果集是否可以滚动,加上如下这句即可

<!-- 配置结果集是否可滚动,分页一定要加上这配置 -->  
<property name="jdbc.use_scrollable_resultset">false</property>

如果是用spring整合hibernate的话,就在spring-cfg.xml配置文件中这样配置

<prop key="hibernate.jdbc.use_scrollable_resultset">false</prop>

七、报错:java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity

出现这种情况的往往是表单提交数据的name属性和提交到的action里的实体类对象名称不一致。造成action里实体类对象为空,所以事务操作失败。解决方法就是表单的name属性值里的实体类对象数据要和action里的实体类对象名称一致,如下2图对应起来。 图片.png 图片.png

八、struts拦截器只能拦截action,却不能拦截jsp页面,所以不能阻止未登录用户非法访问jsp页面

但是有这方面的需求的话,我们可以通过过滤器来实现。如下:
自定义过滤器LoginFilter.java

package com.ssh.common;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//struts2的拦截器只能拦截action而不能拦截jsp页面,所以使用过滤器进行过滤拦截
public class LoginFilter implements Filter {   
    
    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //转化为HttpServlet的请求响应对象
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        //获取访问路径地址
        String uri = req.getRequestURI();
        //System.out.println(uri);
        //String的endsWith()用来测试字符串是否以指定的后缀结尾
        if(uri.endsWith("main.jsp")){
            chain.doFilter(req,res);
            return;  //这里的return一定要加上,否则会不断死循环请求重定向
        }
        //获取session存的值
        String userName = (String)req.getSession().getAttribute("userName");
        if(userName==null){
            System.out.println("未登录用户被拦截在登录注册页面");
            res.sendRedirect("main.jsp");   
        }
        //放行
        chain.doFilter(req,res);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("跟随tomcat启动而自动运行");
    }
} 

配置文件web.xml配置一下

<!-- 拦截未登录用户非法访问jsp页面 -->
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.ssh.common.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

经过以上两步就可以实现未登录用户非法访问jsp啦~

还有另一种阻止非法访问jsp页面的方式,就是把禁止直接被访问的jsp页面放在WEB-INF目录下,此目录下的资源是受保护的,这样别人也不能直接通过url地址来访问此目录下jsp页面,不过我在做不同jsp页面跳转到此目录下的jsp页面也由此而被阻止,试了网上的解决方案暂时还没解决我的问题。

上一篇 下一篇

猜你喜欢

热点阅读