您的位置:首页 > 其它

Web开发过程小结(一)

2014-04-18 12:56 513 查看
1、 Get和Post提交方式的区别

A、 使用get方式提交数据时,会将要提交的数据附加在URL后与URL一起提交,因此在浏览器中可以看到提交的参数和内容。而是用post方式提交数据时,会将Url和数据分别提交,因此所提交的数据不会显示在地址栏。

B、 由于get方式会将数据附加在Url后,所以其长度收浏览器或者web服务器的限制,一般不能超多2K,而post提交时,数据量可以大一点,可以达到4M。

C、 由于get提交数据将数据附加在Url后显示,所以get提交数据没有post提交安全。

2、  include指令包含jsp页面时,被包含的页面头和当前页面头的设置应如下对应:

被包含的jsp:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%>


当前jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>

3、  java连接SqlServer2008,用微软提供的jtds只需要一个jar包就可以,其名称为:jtds-1.2.2.jar,连接驱动配置如下:

<strong> </strong> <property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://localhost:1433/db_vote</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>mks</value>
</property><strong>
</strong>

4、  超链接传值到后台时隐藏参数的解决办法

假如现在我要设置一个超链接“校园生活”,传统的写法都是在href的字符串后面加上键值对传值,但这样会暴露在浏览器地址栏内,如果想隐藏参数可采取如下做法:

(1)、href的值设置为#,也就是说不连接到任何页面。将参数传到函数中去<a href="#" onclick="forumSubmit('${id}')" id="forum_id_click">校园生活</a>
(这里的href要么不设置值,要么就设置为#,如果只写空字符串的话,比如href=""则会出问题,请求提交不到指定的action。最好的做法是不要指定,直接删了这个属性,这样在点击了链接时不会在浏览器中先出现带#的URL再跳转到指定action。不过不指定的话,鼠标放在上面会显示箭头而不是小手标志,感觉很不习惯,这时可以给这个链接添加个css属性,通过设置a标记的cursor属性为pointer则可以改善显示效果。)

(2)、然后,定义一个表单域,设置隐藏值的字段,其参数值由js函数赋值
<form method="post" action="forumService" id="hd_frm">
<input type="hidden" id="hd_forumId" name="forumIdStr" value=""/>
</form>
(3)、然后写个js函数,处理点击事件,将链接传过来的参数值赋给实际传到后台的参数,然后提交表单,后台接受处理
function forumSubmit(num){
document.getElementById("hd_forumId").value = num;
document.getElementById("hd_frm").submit();
}
可以看到整个过程实际上是提交了表单传到后台,参数也是跟着表单以post的方式传到后台的,但形式上还是以超链接的形式表现。

5、 Action、Service、Dao的分工问题

SSH应用中,一般都会将一个完整的请求处理拆分成3个步骤,一般通用的是action调用service、service中调用dao。其中action负责请求转发和业务流程控制,其中包括业务流程转向的控制、数据的收集和简易的整理,以及回传数据的转发等。Service被action调用,将接受到的数据做一些实际性的逻辑处理、业务整合处理、异常和差错控制等,然后将处理好的数据包括处理了的异常信息返回个action。Dao的主要工作就是负责与数据库交互,交换与业务逻辑无关的数据。所以总的来说,action负责调度控制、service负责数据和业务处理,到负责底层的数据交互。

异常处理:建议在service和dao层都不要捕获异常,因为最终是action处理异常,直接交给action来处理就行。另外spring事务机制一般在service执行,如果在service层处理了异常,则spring不知道是不是改进行事务操作了。

6、 Spring加载和读取配置文件的方法

在实际项目中,许多默认值或者常量的配置在哪里设置是个问题,比如说数据库连接的url地址、数据库连接的用户名密码信息、以及其他用到的默认配置等,如果将这些值以硬编码的方式写在程序中,当然也是没问题的,但是带来一个问题,当你的应用交付别人使用的时候,假如现在换数据库地址了,用户是不知道怎么去在程序里修改这些值的,即便不考虑到用户,就我们自己来说,将一些常量配置给脱离出来形成单独的可读文件,也是利于后期维护的。Spring在加载配置文件方面提供了很好的帮助,下面举个例子说明。

比如我现在要将数据库连接的信息写在一个配置文件中,一般是xml文件或者properties文件,我喜欢用properties文件,如此处的jdbc.properties:

jdbcUrl=jdbc\:jtds\:sqlserver\://localhost\:1433/db_vote
jdbcDriverName=net.sourceforge.jtds.jdbc.Driver
jdbcUserName=sa
jdbcPass=mks
文件的位置为src下的config文件夹中,然后再applicationContext.xml中添加如下配置:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config/default.properties</value>
<value>classpath:config/jdbc.properties</value>
</list>
</property>
</bean>
这样,在项目启动时,spring将加载配置的属性文件,如果在其他的配置中需要用到这些属性,在可以使用如下方式读取:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${jdbcDriverName}</value>
</property>
<property name="url">
<value>${jdbcUrl}</value>
</property>
<property name="username">
<value>${jdbcUserName}</value>
</property>
<property name="password">
<value>${jdbcPass}</value>
</property>
</bean>

如果在项目的程序中需要读取属性配置,一种方式是配置bean的时候利用property属性将对应的属性多为目标bean的成员变量注入进去,另一种是重载spring的加载配置文件的类,将这些属性读到map中,并提供读取接口,如:

首先,继承PropertyPlaceholderConfigurer类:

package com.bbs.utils;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

public class PropertiesLoaderUtil extends PropertyPlaceholderConfigurer {
private static Map<String,String> map;
//重载方法
@Override
protected void processProperties(
ConfigurableListableBeanFactory beanFactoryToProcess,
Properties props) throws BeansException {
super.processProperties(beanFactoryToProcess, props);
map = new HashMap<String, String>();
for(Object key : props.keySet()){
String keyStr = key.toString();
map.put(keyStr, props.get(keyStr).toString());
}
}

public static String getProperty(String propName){
return  map.get(propName);
}

}

然后在配置的时候,将加载的类改为刚才写的类:

<bean id="propertyConfigurer" class="com.bbs.utils.PropertiesLoaderUtil">
<property name="locations">
<list>
<value>classpath:config/default.properties</value>
<value>classpath:config/jdbc.properties</value>
</list>
</property>
</bean>

这样,在程序中需要用到某个属性值的时候,直接用类似

PropertiesLoaderUtil.getProperty("jdbcUrl "),
便可读取到属性值。
7、 IOException while loading persisted sessions: java.io.EOFException的解决办法

EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。异常是tomcat本身的问题,由于tomcat上次非正常关闭时有一些活动session被持久化(表现为一些临时文件),在重启时,tomcat尝试去恢复这些session的持久化数据但又读取失败造成的。此异常不影响系统的使用。

解决办法:

将tomcat6/work/Catalina/localhost/yourProjectName/SESSIONS.ser删除。如果正常关闭服务端,该文件是自动删除的。

8、mainPage思想:在实际项目中,网页分块的方式很多,比如通过frame或者其他的办法。这里提供一个方法,就是把框架网页设置好,然后再中间或者其他需要引入动态网页的部门用jsp include将动态页面包含进去,只不过这个动态页面本身也是变量,其值可以在action传值的时候指定。详细应用情况参见bbs项目。

9、Java获取当前文件路径的几种方式:

private void pathTest(){
System.out.println("user.dir:"+System.getProperty("user.dir"));
System.out.println("contextLoader:"
+ Thread.currentThread().getContextClassLoader()
.getResource("").getPath());
System.out.println("classPath:"+getClass().getResource("").getPath());
System.out.println("classLoader:"
+ getClass().getClassLoader().getResource("").getPath());
}<strong>
</strong>将以上代码运行一下便可看出效果。

10、Struts2模型驱动获取前台数据的两种方式

Struts2中获取前台数据有几种方式。以登录为例,前台输入用户名密码,后台抓取以验证。则有以下几种方式:

(1)、 普通抓取1

前台表单input的name属性为:username/password,后台action中,用ServletActionContext.getRequest.getParameter(“username”)来获取参数。这事通用的方法。

(2)、 普通抓取2

前台表单input的name属性为:username/password,后台action中声明成员变量username和password,并提供set/get方法。

(3)、 模型驱动1

前台表单input的name属性为:user.username/user.password,后台action中声明成员变量User user =new User(),并提供set/get方法。

(4)、 模型驱动2

前台表单input的name属性为:username/password,后台action实现ModelDriven<User>接口,并在action中声明成User user =new User(),这样也可以将参数包装进user对象内,这样做的好处是前台不用写user.xxx的方式。

11、ajax提交请求时页面跳转控制/ajax请求后台验证无效后处理

在实际web开发中,经常用到ajax实现页面局部刷新,很方便,体验也很好,但有时会遇到如下场景:

    jquery的ajax提交一个请求,请求action1,在ssh框架中使用了struts拦截器,经权限验证,发现当前系统用户没有登录,不能进行此操作,这时想给页面跳转至login.jsp。但实际执行时,由于是ajax方式,页面并不会跳转刷新,而是将login.jsp的页面源码写入了请求页面,这也是ajax本身的特点:局部刷新。这样我们就无法完成页面跳转,不管在拦截器中return什么result都无法完成页面跳转。

    场景交代完毕。这里提供一个解决方案:利用jquery中ajax一个全局函数$.ajaxSetup(properties),设置AJAX请求的默认参数选项。设置后,ajax请求都会按照这里定义的属性执行。核心代码如下:

    前台js:
/**ajax请求初始化设置*/
$.ajaxSetup({
type : 'POST',
contentType:"application/x-www-form-urlencoded;charset=utf-8",
complete:function(XMLHttpRequest,textStatus){
//通过XMLHttpRequest取得响应头,sessionstatus
var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");
if(sessionstatus=="timeout"){
//这里怎么处理在你,这里跳转的登录页面
//window.location.replace("index.jsp");
parent.$.messager.progress('close');
showMessager('数据加载出错!您可能未登录或者登录超时,请刷新页面或者重新登录!');
}
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
try {
parent.$.messager.progress('close');
parent.$.messager.alert('错误(来自syUtil)', '请求出错!请尝试刷新页面或重新登录!'+XMLHttpRequest.responseText);
} catch (e) {
alert(XMLHttpRequest.responseText);
}
}
});

后台拦截器:

if ((sessionInfo != null && sessionInfo.getYhName() != null && !sessionInfo
.getYhName().trim().equals(""))
|| ignore == true) {
return arg0.invoke();
} else{
/*
* ajax请求验证,如果没有登录或者登录超时,向Header发送消息,前台根据获取的消息决定做如何操作
*/
ServletActionContext.getResponse().setHeader("sessionstatus", ConstantUtil.SESSION_STATUS_TIMEOUT);
/*
* 向前台需要用到easyUI的messager的控件发送消息
*/
PJson j = new PJson();
j.setMsg(ConstantUtil.SESSION_STATUS_TIMEOUT_MSG);
writeJSON(j);
/*
* ajax请求无法在后台进行页面跳转,所以此处返回null即可,如果要完成跳转,应在上面设置sessionstatus,然后根据传的参数,在前台做跳转
*/
return null;
}
红色字体为关键代码。其中showMessager是自定义的一个弹出对话框函数。其逻辑就是:在后台拦截器中将属性sessionstatus设置一个标志,此处设置为一个字符串“timeout”(ConstantUtil.SESSION_STATUS_TIMEOUT是后台定义的字符串常量,值为ConstantUtil.SESSION_STATUS_TIMEOUT),ajax请求完成后,根据complete里的代码,决定做如何操作,比如页面跳转或者弹出提示信息。

12、html中form和table

html中form和table混合使用时,table要作为form的子元素,要不然form提交可能会出错,后台接收不到数据。

13、jsp中封装list

jsp中封装JavaBean并组装成list的做法如下:

    场景:现在有两个pojo,一个叫Model1,一个叫Model2,其中Model1中有个List,其泛型是Model2。这时希望在jsp中封装Model1到Action中(包括其中的list属性),其代码如下:

jsp页面:
<input type=”text” name=”property0”/>
<input type=”text” name=” propertyList [0].property1”/>
<input type=”text” name=” propertyList [0].property2”/>
<input type=”text” name=” propertyList [1].property1”/>
<input type=”text” name=” propertyList [1].property2”/>
JavaBean:
Class Model1{
String property0;
List<Model2> propertyList;
Setter、、、
Getter、、、
}
Class Model2{
String property1;
Integer property2;
Setter、、、
Getter、、、
}

Action:

Class TestAction implements ModelDriven<Model1>……
private Model1 model;
setter……
getter……
……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: