SSH 项目过程中遇到的问题和解决方法汇总 struts2 spring hibernate
2014-01-01 16:20
691 查看
问题:struts如何传递数据到jsp?
答案:
Struts的action传参给jsp:可以用传统的在request/session中加入参数的方法
也可以:
<s:set name="userList" value="persons"></s:set> (persons是action的变量,需要有getPersons())
<s:property value="persons"/>
也相当于用传统的jsp嵌入java的写法:
<%=request.getAttribute("persons") %>
如果比较逻辑比较复杂的时候,如果不熟悉struts,建议后最后这种传统方法
Struts2获取response和request
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象
在action中返回下载流或者json:
如果单独返回,不用配置的返回的话,就需要手工配置返回的字符编码
action函数执行完不要返回任何东西,但需要先操作response
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
response.setHeader("Content-disposition", "attachment; filename="+
"table.xls"); try {
excelWriter.expt();
System.out.println(" 导出Excel文件[成功] ");
} catch (IOException ex) {
System.out.println(" 导出Excel文件[失败] ");
ex.printStackTrace();
}
response.getOutputStream().flush();
Hibernate:
1.由于没有配置openSessionInView(一个request过程中用一个Hibernate的session),现在需要每次查询都打开一次session。这样的好处是减低数据库连接池的消耗,另外不会出一些难以理解的问题。
所
以,例如选择了class(班级)
a,然后a里边有一个studentList。student是class的1对多,多的那端。这个studentList.get(0).id是有的,
但其他信息都为null。也就是说,如果需要student信息,需要利用id再查询student。
问题:下拉列表怎么多个联动?
回答:
1.可以全部一次获取到前台
2.可以下拉一个之后,就submit到同一个jsp,刷新页面(但如果jsp有原来struts的action传来的收据的话,这种做法就行不通了)
3.ajax~~
建议使用第一种:
参考:http://zhidao.baidu.com/question/161625934.html
问题:struts2如何返回错误信息到提交请求的页面?
答案:在result中配置一个name为input的跳转,然后处理请求的函数返回“input”,返回前需要把错误信息放到session中,然后jsp获取出来显示
这样会有问题,也就是原来那个jsp的页面状态保存不了(例如下拉框选择了什么,分页显示到第几页)。
这没办法的~~需要我们自己另外把页面的状态保存起来。
问题:怎么上传excel的时候做到不刷新本页面,就等待返回成功或者错误的弹出框?
答案:在fm中设置target属性,指向一个
隐藏的iframe,表示返回的内容在哪里显示。可以参考filemanager的fileManager.html。然后action处理完不要转到
jsp,只需要返回“alert(""xxxxxx"")"或者自定义函数,使得在iframe中控制父页面执行某些动作。
我做文件管理器就是这样做的。
<fm id="uploadFileFm" target="hiddenFrame" method="post" enctype="multipart/fm-data">
<input id="fileInput" type="file" name="upload" >
<input id="hiddenDirecty" type="hidden" value="" name="directy">
<input type="button" id ="uploadButton" value="开始上传"/>
</fm>
问题:jsp页面怎么在提交之后,继续保持状态?例如当前是第几页,下拉框选择了什么?
答案:没有像asp.net这么简单的做法,只能
根据原理去做。提交的时候,把页码,下拉框之类的都post过去。第一个action处理完之后,带着request参数转到另外一个action。在第
二个action中获取相应的参数(这时还是继续有struts自动封装的效果)。
(见阳江项目)
问题:struts2如何批量删除?
答案:这个跟普通的jsp+Servlet做法类似。定义checkbox,name都统一为例如。普通Servlet做法就是,request.getParameterValues(""),获取String[]。
action中定义String[] 数组(或者其他类型)。struts2自动装配进去。
例如:
<fm action="testPerson.action" method="post">
<input type="checkbox" name="" value="1">
<input type="checkbox" name="" value="2">
<input type="checkbox" name="" value="3">
<input type="checkbox" name="" value="4">
<input type=""submit"" value="Submit" />
</fm>
在前台,例如我只选中了1,4两个框。
那么在后台获取的String[],则只有“1”和“4”
问题:怎么直接new新建一个DAO或者Service进行测试?
答案:通过Spring,获取配置文件中的Bean。这些bean将会在ApplicationContext.xml加载的时候初始化。
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
PersonDAO personDAO = (PersonDAO) ac.getBean("personDAO");
System.out.println(personDAO.getEntityName());
问题:在XXXXList页面,点击修改,跳转到修改页面,修改之后,如何返回XXXList页面,同时保持原来的状态(页码)?
回答:使用弹出窗口。XXXXList页面使用以下代码:
<script>
function refresh(){
XXXXfm.submit(); //使用post的方式刷新
}
function newWin(){
window.open(""newWin.htm"");
}
</script>
新开的页面,保存/关闭的时候,调用:
function closeme(){
window.opener.refresh();
//以下代码是为了避免浏览器提问是否关闭
var browserName=navigat.appName;
if (browserName=="Netscape") {
window.open("""",""_parent"","""");
window.close();
} else if (browserName=="Microsoft Internet Expler") {
window.opener = "whocares";
window.close();
} }
如果没必要保持状态的修改,例如用户列表,联系人列表,就直接同一个窗口内跳转就可以了。
问题:java.io.CharConversionException: Not an ISO 8859-1 character: XXX
回答:这个问题可能是因为outputstream输出中文字造成的影响。
response.setContentType("text/html;charset=UTF-8");
//response.getOutputStream().print("中文字"); //这行会出错
response.getWriter().print("中文字"); //换成这个就好了
response.getWriter().close();
原因我个人觉得是因为outputstream是以字节为单位输出字符串的,需要符合那个ISO 8859-1编码;但要输出的字符串是UTF8编码的,所以就有问题。但根源问题,我真没想通。
换成Writer就好了。可能是因为那个inputstream和reader,outputstream和Writer的区别吧。
问题:使用struts2,如何处理action的路径?还有,在action转到的jsp中,如何写js,css,图片的路径?(例如访问http://localhost/project/listUser.action后转到http://localhost/project/user/listUser.jsp,这时候浏览器还是停留在http://localhost/project/addUser.action)
答:action的话,就不需要关心路径问题。我们不使用action的命名空间。因为使用了这样的匹配:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
无论前边是什么路径,struts2只看后边的匹配。
而解决jsp的路径问题,以下方式就基本完美了:
第一步:在jsp的head中添加base标签和一段java
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPt()
+ path + "/";
%>
<base href="<%=basePath%>">
第二步:所有的路径使用“半绝对路径”。所谓半绝对路径,是我乱说的。例如:<link rel="stylesheet" type="text/css" href="style/table.css" />
这种本来是相对路径,就是当前jsp目录下的style目录的table.css。
在我们struts2和配置了base的前提下,这里就会被浏览器解释为http://localhost/project/style/table.css。
也就是说,需要写从项目根目录算起的绝对路径,但去掉开头的"/"
第三步:所有action跳转,fm提交写的action路径,都不要带目录位置。只写action名,例如addUser.action。
这样,浏览器就一直停留在http://localhost/project/XXXXX.action 这一层。
第一步:在jsp的head中同样添加base,但把getContextPath改为getRequestURI
d
<%
String path = request.getRequestURI();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPt()
+ path;
%>
<base href="<%=basePath%>">
注意是request.getRequestURI,这样获取出来的正好就是jsp的绝对路径。
例如浏览器地址栏是:http://localhost:8084/project/listUser.action
base是<base href="http://localhost:8084/project/admin/listUser.jsp">
第二步:jsp页面内,全部使用相对路径访问。
第三步,就不必管action的路径如何了。
这个方法,可以兼容使用action和不使用action两种情况
问题:如何使用多个Struts和Spring配置文件?
回答:有不少方法,但我喜欢在主配置文件中impt其他子文件。
Spring:在文件最后</beans>前,加入include。例如
<impt resource="wenhui-springConfig.xml"></impt>
<impt resource="xiangpeng-springConfig.xml"></impt>
<impt resource="mingyi-springConfig.xml"></impt>
<impt resource="haichuan-springConfig.xml"></impt>
</beans>
然后子文件写法跟主配置文件一致,从beans节点开始,里边全部是bean
Struts:在文件最后</struts>前,include其他文件。例如
<include file="struts_wenhui.xml"></include>
<include file="struts_xiangpeng.xml"></include>
<include file="struts_mingyi.xml"></include>
<include file="struts_haichuan.xml"></include>
</struts>
然后子文件写法跟主配置文件一致,从<struts>开始,然后是<package>。需要注意的是每个文件的package的name属性要不相同。
问题:数据库没有设置级联删除,Hibernate删除“一那方”的时候,会不会删除“多的那方”?
答案:如果按默认配置是不会的。需要在hbm文件中配置cascade规则。
参考:http://www.blogjava.net/zhyiwww/archive/2006/04/06/39576.html
但这样其实也不方便,还不如直接到数据库里边设置级联删除。
所以我们做法是:Hibernate里就不设置级联的配置,基本一旦有外键就无法删除,需要手工去删除多的一方(这样一般来说也符合业务要求)。如果真需要(例如删除用户,就删除UserToRole和LoginLog),所以就到数据库设置级联删除。
问题:spring启动的线程,或者普通的java类中怎么获取web目录?例如删除临时文件的线程类中。
答案:
在web.xml中的<web-app>节点内加入:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>tansungWeb.root</param-value>
</context-param>
<listener>
<listener-class>g.springframewk.web.util.WebAppRootListener</listener-class>
</listener>
然后在普通类中,使用System.getProperty("tansungWeb.root")获取了web根目录。
然后再拼凑路径的时候,最好不要直接使用/或者\,最好使用File.separatChar
答案:
Struts的action传参给jsp:可以用传统的在request/session中加入参数的方法
也可以:
<s:set name="userList" value="persons"></s:set> (persons是action的变量,需要有getPersons())
<s:property value="persons"/>
也相当于用传统的jsp嵌入java的写法:
<%=request.getAttribute("persons") %>
如果比较逻辑比较复杂的时候,如果不熟悉struts,建议后最后这种传统方法
Struts2获取response和request
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象
在action中返回下载流或者json:
如果单独返回,不用配置的返回的话,就需要手工配置返回的字符编码
action函数执行完不要返回任何东西,但需要先操作response
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
response.setHeader("Content-disposition", "attachment; filename="+
"table.xls"); try {
excelWriter.expt();
System.out.println(" 导出Excel文件[成功] ");
} catch (IOException ex) {
System.out.println(" 导出Excel文件[失败] ");
ex.printStackTrace();
}
response.getOutputStream().flush();
Hibernate:
1.由于没有配置openSessionInView(一个request过程中用一个Hibernate的session),现在需要每次查询都打开一次session。这样的好处是减低数据库连接池的消耗,另外不会出一些难以理解的问题。
所
以,例如选择了class(班级)
a,然后a里边有一个studentList。student是class的1对多,多的那端。这个studentList.get(0).id是有的,
但其他信息都为null。也就是说,如果需要student信息,需要利用id再查询student。
问题:下拉列表怎么多个联动?
回答:
1.可以全部一次获取到前台
2.可以下拉一个之后,就submit到同一个jsp,刷新页面(但如果jsp有原来struts的action传来的收据的话,这种做法就行不通了)
3.ajax~~
建议使用第一种:
参考:http://zhidao.baidu.com/question/161625934.html
问题:struts2如何返回错误信息到提交请求的页面?
答案:在result中配置一个name为input的跳转,然后处理请求的函数返回“input”,返回前需要把错误信息放到session中,然后jsp获取出来显示
这样会有问题,也就是原来那个jsp的页面状态保存不了(例如下拉框选择了什么,分页显示到第几页)。
这没办法的~~需要我们自己另外把页面的状态保存起来。
问题:怎么上传excel的时候做到不刷新本页面,就等待返回成功或者错误的弹出框?
答案:在fm中设置target属性,指向一个
隐藏的iframe,表示返回的内容在哪里显示。可以参考filemanager的fileManager.html。然后action处理完不要转到
jsp,只需要返回“alert(""xxxxxx"")"或者自定义函数,使得在iframe中控制父页面执行某些动作。
我做文件管理器就是这样做的。
<fm id="uploadFileFm" target="hiddenFrame" method="post" enctype="multipart/fm-data">
<input id="fileInput" type="file" name="upload" >
<input id="hiddenDirecty" type="hidden" value="" name="directy">
<input type="button" id ="uploadButton" value="开始上传"/>
</fm>
问题:jsp页面怎么在提交之后,继续保持状态?例如当前是第几页,下拉框选择了什么?
答案:没有像asp.net这么简单的做法,只能
根据原理去做。提交的时候,把页码,下拉框之类的都post过去。第一个action处理完之后,带着request参数转到另外一个action。在第
二个action中获取相应的参数(这时还是继续有struts自动封装的效果)。
(见阳江项目)
问题:struts2如何批量删除?
答案:这个跟普通的jsp+Servlet做法类似。定义checkbox,name都统一为例如。普通Servlet做法就是,request.getParameterValues(""),获取String[]。
action中定义String[] 数组(或者其他类型)。struts2自动装配进去。
例如:
<fm action="testPerson.action" method="post">
<input type="checkbox" name="" value="1">
<input type="checkbox" name="" value="2">
<input type="checkbox" name="" value="3">
<input type="checkbox" name="" value="4">
<input type=""submit"" value="Submit" />
</fm>
在前台,例如我只选中了1,4两个框。
那么在后台获取的String[],则只有“1”和“4”
问题:怎么直接new新建一个DAO或者Service进行测试?
答案:通过Spring,获取配置文件中的Bean。这些bean将会在ApplicationContext.xml加载的时候初始化。
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
PersonDAO personDAO = (PersonDAO) ac.getBean("personDAO");
System.out.println(personDAO.getEntityName());
问题:在XXXXList页面,点击修改,跳转到修改页面,修改之后,如何返回XXXList页面,同时保持原来的状态(页码)?
回答:使用弹出窗口。XXXXList页面使用以下代码:
<script>
function refresh(){
XXXXfm.submit(); //使用post的方式刷新
}
function newWin(){
window.open(""newWin.htm"");
}
</script>
新开的页面,保存/关闭的时候,调用:
function closeme(){
window.opener.refresh();
//以下代码是为了避免浏览器提问是否关闭
var browserName=navigat.appName;
if (browserName=="Netscape") {
window.open("""",""_parent"","""");
window.close();
} else if (browserName=="Microsoft Internet Expler") {
window.opener = "whocares";
window.close();
} }
如果没必要保持状态的修改,例如用户列表,联系人列表,就直接同一个窗口内跳转就可以了。
问题:java.io.CharConversionException: Not an ISO 8859-1 character: XXX
回答:这个问题可能是因为outputstream输出中文字造成的影响。
response.setContentType("text/html;charset=UTF-8");
//response.getOutputStream().print("中文字"); //这行会出错
response.getWriter().print("中文字"); //换成这个就好了
response.getWriter().close();
原因我个人觉得是因为outputstream是以字节为单位输出字符串的,需要符合那个ISO 8859-1编码;但要输出的字符串是UTF8编码的,所以就有问题。但根源问题,我真没想通。
换成Writer就好了。可能是因为那个inputstream和reader,outputstream和Writer的区别吧。
问题:使用struts2,如何处理action的路径?还有,在action转到的jsp中,如何写js,css,图片的路径?(例如访问http://localhost/project/listUser.action后转到http://localhost/project/user/listUser.jsp,这时候浏览器还是停留在http://localhost/project/addUser.action)
答:action的话,就不需要关心路径问题。我们不使用action的命名空间。因为使用了这样的匹配:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
无论前边是什么路径,struts2只看后边的匹配。
而解决jsp的路径问题,以下方式就基本完美了:
第一步:在jsp的head中添加base标签和一段java
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPt()
+ path + "/";
%>
<base href="<%=basePath%>">
第二步:所有的路径使用“半绝对路径”。所谓半绝对路径,是我乱说的。例如:<link rel="stylesheet" type="text/css" href="style/table.css" />
这种本来是相对路径,就是当前jsp目录下的style目录的table.css。
在我们struts2和配置了base的前提下,这里就会被浏览器解释为http://localhost/project/style/table.css。
也就是说,需要写从项目根目录算起的绝对路径,但去掉开头的"/"
第三步:所有action跳转,fm提交写的action路径,都不要带目录位置。只写action名,例如addUser.action。
这样,浏览器就一直停留在http://localhost/project/XXXXX.action 这一层。
第一步:在jsp的head中同样添加base,但把getContextPath改为getRequestURI
d
<%
String path = request.getRequestURI();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPt()
+ path;
%>
<base href="<%=basePath%>">
注意是request.getRequestURI,这样获取出来的正好就是jsp的绝对路径。
例如浏览器地址栏是:http://localhost:8084/project/listUser.action
base是<base href="http://localhost:8084/project/admin/listUser.jsp">
第二步:jsp页面内,全部使用相对路径访问。
第三步,就不必管action的路径如何了。
这个方法,可以兼容使用action和不使用action两种情况
问题:如何使用多个Struts和Spring配置文件?
回答:有不少方法,但我喜欢在主配置文件中impt其他子文件。
Spring:在文件最后</beans>前,加入include。例如
<impt resource="wenhui-springConfig.xml"></impt>
<impt resource="xiangpeng-springConfig.xml"></impt>
<impt resource="mingyi-springConfig.xml"></impt>
<impt resource="haichuan-springConfig.xml"></impt>
</beans>
然后子文件写法跟主配置文件一致,从beans节点开始,里边全部是bean
Struts:在文件最后</struts>前,include其他文件。例如
<include file="struts_wenhui.xml"></include>
<include file="struts_xiangpeng.xml"></include>
<include file="struts_mingyi.xml"></include>
<include file="struts_haichuan.xml"></include>
</struts>
然后子文件写法跟主配置文件一致,从<struts>开始,然后是<package>。需要注意的是每个文件的package的name属性要不相同。
问题:数据库没有设置级联删除,Hibernate删除“一那方”的时候,会不会删除“多的那方”?
答案:如果按默认配置是不会的。需要在hbm文件中配置cascade规则。
参考:http://www.blogjava.net/zhyiwww/archive/2006/04/06/39576.html
但这样其实也不方便,还不如直接到数据库里边设置级联删除。
所以我们做法是:Hibernate里就不设置级联的配置,基本一旦有外键就无法删除,需要手工去删除多的一方(这样一般来说也符合业务要求)。如果真需要(例如删除用户,就删除UserToRole和LoginLog),所以就到数据库设置级联删除。
问题:spring启动的线程,或者普通的java类中怎么获取web目录?例如删除临时文件的线程类中。
答案:
在web.xml中的<web-app>节点内加入:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>tansungWeb.root</param-value>
</context-param>
<listener>
<listener-class>g.springframewk.web.util.WebAppRootListener</listener-class>
</listener>
然后在普通类中,使用System.getProperty("tansungWeb.root")获取了web根目录。
然后再拼凑路径的时候,最好不要直接使用/或者\,最好使用File.separatChar
相关文章推荐
- SSH 项目过程中遇到的问题和解决方法汇总 struts2 spring hibernate
- 【struts2】开发过程中遇到的需要注意的小问题的原因与解决方法
- 一个基于SSH的实践项目在开发过程中遇到的问题汇总
- 在练习ssh项目时遇到的问题及解决方法
- 从 .net 1.1 升级到 2.0过程中遇到的问题及解决方法
- pip的安装以及在安装的过程中遇到的问题及解决方法
- QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
- kerkee demo编译连接过程中遇到的问题及解决方法(iOS)
- 搭建SSH时的思考和遇到的几个问题的解决方法
- caffe安装过程中遇到的问题以及解决方法
- volcanol_Linux_问题汇总系列_1_系统引导过程中到check filesystem时就无法继续引导问题解决方法。
- SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法【已验证 】
- 安装Hadoop 2.7.3的过程中遇到的一些问题及解决方法。
- 系统安装过程中遇到的一些问题及解决方法
- 蘑菇街TeamTalk编译连接过程中遇到的问题及解决方法(iOS)
- ubuntu server14.04LTS下手动模拟DNS并配置虚拟主机以及配置过程遇到的问题的解决方法
- Android Studio导入新项目遇到的问题及解决方法
- Android环境搭建的过程中遇到的问题及解决方法
- springmvc项目搭建过程中遇到的BUG及其解决方法
- WEB开发过程中遇到的各种问题及解决方法总结