【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.js
和dojo-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页面也由此而被阻止,试了网上的解决方案暂时还没解决我的问题。