记录Harde学习成长生活的点点滴滴.
2009-05-28 Java


没有评论
23 次浏览

一个简单的Servlet使用实例

要是您说有struts要servlet干嘛,对不起,本文不适合您。
要说您是JAVA高端编程人员,对不起,不要浪费您的时间,本文很基础。

先简单介绍下Servlet(知道的就知道了,不知道的估计看了也白费,更多详情,大家可以参见百度百科:http://baike.baidu.com/view/25169.htm

Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。 它担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层。
  Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

目前就我而言,最常用的地方还是登录验证
首先写个index.html

<form action="servlet/login" method="post">
<input type="text" name="userName" />
<input type="password" name="uPass" />
<input type="submit" value="提交">
</form>

ok,一个简单的登录表单做完

相信初学者大多会提及到一个jsp页面,由jsp来处理提交数据,事实上,我最开始也是这么干的……

不废话,下面我给大家介绍下,手动创建一个Servlet的过程,新建一个class,名字随便,我起了DoLogin

导包

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

继承HttpServlet

public class DoLogin extends HttpServlet

主要我们重写doPost与doGet这2个方法就足够了
一般来说我们处理get与post都是一样的
所以在doGet里我们可以这样写

public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	this.doPost(request, response);
}

下面我们开始写doPost
假设我们现在有个JavaBean User和一个Dao UserDAO,UserDAO中有个getUserByUserName(String userName)静态方法

public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	String userName = request.getParameter("userName");
	String userPassword = request.getParameter("uPass");
	User user = null;
	if (userName!=null&&!"".equals(userName)&&userPassword!=null&&!"".equals(userPassword))
	{
		user = UserDAO.getUserByName(userName);
		if (user!=null&&userPassword.equals(user.getUserPassword))
		{
			request.getRequestDispatcher("success.jsp").forward(request, response);
		}
		else
		{
			response.sendRedirect("error.jsp");
		}
	}
	else
	{
		response.sendRedirect("error.jsp");
	}
}

OK,一个简单的servlet我们就写完了(实际使用中,一般还会重写init()方法和destroy()以便于初始化数据和销毁数据)
但是现在这个servlet还不能用
需要我们配置下
打开web.xml
下(就是和同级)写下如下数据

  
    DoLogin
    DoLogin  这里是指定servlet包的地方,如果你的servlet在src下的servlet包里
那么这里就应该写为servlet/Dologin
  

  
    DoLogin 必须与上面的对应
    /servlet/login 网址,可以理解为虚拟路径,如果大家细心,可以发现,我form表单的action就是这个,大家能理解吧
  

另外servlet可以对应多个url
比如说我还想让他有个/admin/login 的访问地址
那么就再写个

  
    DoLogin
    /admin/login
  

一个简单的三表联查例子

今天做项目时,用到的,弄了半天,结果发现其实最简单的语句就能做到
因为我项目的表东西太多
我新建三个表来说

用户登录日志表
UserLoginLog
id 主键 自动增长
userId 外键 用户ID
loginTime 登陆时间
logofftime 登出时间

用户数据表
User
id 主键 自动增长
userName 用户名
userType 外键 用户类型

用户类型表
id 主键 自动增长
typename 户名类型的名称

我想要实现的效果就是
查出 UserLoginLog中的所有数据 但是需要标明是谁登陆的,身份是什么
换句话说就是把userId换成 typename与username

首先写下基础语句

1
select * from [UserLoginLog]

看下结果

1
2
3
4
id          userId      loginTime                                          logoffTime
----------- ----------- --------------------------------------------------
1           1           2009/05/26 07:24:53                                2009/05/26 07:24:56
2           1           2009/05/26 07:25:19                                NULL

OK,开始添油加醋
首先把userid换成useName

1
2
select ull.id,u.userName,ull.logintime,isnull(ull.logofftime,'非正常退出') as loginofftime from UserLoginLog as ull,[User] as u where ull.userId = u.id
--千万别忘了where关联语句

现在结果是这个样子的

1
2
3
4
id          userName         logintime                                          loginofftime
----------- ---------------- --------------------------------------------------
1           admin            2009/05/26 07:24:53                                2009/05/26 07:24:56
2           admin            2009/05/26 07:25:19                                非正常退出

继续,现在把Type弄进来

1
select ull.id,t.typeName,u.userName,ull.logintime,isnull(ull.logofftime,'非正常退出') as loginofftime from UserLoginLog as ull,[User] as u,[UserType] as t where ull.userid=u.id and u.type = t.id
1
2
3
4
id          typeName                   userName         logintime                             loginofftime
----------- ------------------------------------------- ------- -------------------------
1           管理员                         admin            2009/05/26 07:24:53             2009/05/26 07:24:56
2           管理员                         admin            2009/05/26 07:25:19             非正常退出

好了,达到预期效果了
最后加上分页就算搞定了
因为我的语句是在C#程序中组装的
所以大家如果要使用储存过程时
把第一个top 10 的10 换成rowsPerPage 第二个10换成rowsPerPage*pageNum就行了

1
select top 10 ull.id,t.typeName,u.userName,ull.logintime,isnull(ull.logofftime,'非正常退出') as loginofftime from UserLoginLog as ull,[User] as u,[UserType] as t where ull.userid=u.id and u.type = t.id and (ull.id not in (select top 0 ull.id from [UserLoginLog] order by ull.id desc)) order by ull.id desc

写在最后
其实最开始打算用外联来弄,但是写到最后,还是觉得现在写的最为方便……

大家若有其他什么方法,请留言告诉我谢谢

PS:向大家道个歉,上文中子查询的select top 0 ull.id from [UserLoginLog] order by ull.id desc
是错误的
应该写成select top 0 ulll.id from [UserLoginLog] as ulll order by ulll.id desc
因为如果像原来那么写
子查询查出来的是前面主查询查询出来的10条
结果造成的就是无论pagenum传入多少,都将返回0行……

C#中几种获取当前路径的方法(绝对路径)

应该算是出于对各种DOCK的烦躁(部分DOCK程序在启动程序时,会把当前路径指派为DOCK所在路径,当程序中使用相对路径时,路径对“相对”到DOCK的文件夹里),我在程序中大多使用绝对路径来定位文件

方便后来者,在这里总结了下,也摘抄了点网上流传的

以我的程序为例

物理路径:

E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe

 

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
System.Environment.CurrentDirectory;
//很熟悉了,获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
 
//返回E:\c#学习\获取当前路径\获取当前路径\bin\Debug
 
 
 
System.AppDomain.CurrentDomain.BaseDirectory;
 
//我用的最多的方法,获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。
 
//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug\
 
 
 
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
 
//获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。
 
//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe
 
 
 
 System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
 
//获取和设置包含该应用程序的目录的名称。
 
//返回  E:\c#学习\获取当前路径\获取当前路径\bin\Debug\
 
 
 
System.Windows.Forms.Application.StartupPath;
 
//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
 
//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug
 
 
 
System.Windows.Forms.Application.ExecutablePath;
 
//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
 
//返回  E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe
 
 
 
System.IO.Directory.GetCurrentDirectory();
 
//获取应用程序的当前工作目录(不可靠)。
 
//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug
 
//这个方法其实是我最早知道的,但是也是我用的最少的,总感觉基于IO的东西都不怎么可靠
 
//至于上面的“(不可靠)”不是我加的,是网上的大大们写的,我只是Copy过来了
 
 
 
//另外还有一个方法
 
 this.GetType().Assembly.Location;
 
//获取当前进程的完整路径,包含文件名(进程名)。
 
//遗憾的静态方法无法使用
 
//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe

随心、随性、随缘、随遇

随心、随性、随缘、随遇

寺院里的地是枯黄的,很难看。小和尚看不过去,对师傅说:师傅,快撒点种子吧!师傅曰:不着急,随时。

种子到手了,师傅对小和尚说,去种吧。不料,一阵风起,撒下去不少,也吹走不少。小和尚着急地对师傅说,师傅,好多种子都被吹飞了。师傅说,没关系,吹走的净是空的,撒下去也发不了芽,随性。

刚撒完种子,这时飞来几只小鸟,在土里一阵刨食。小和尚急着对小鸟连轰带赶,然后向师傅报告说,糟了,种子都被鸟吃了。师傅说,急什么,种子多着呢,吃不完,随遇。

半夜,一阵狂风暴雨。小和尚来到师傅房间带着哭腔对师傅说,这下全完了,种子都被雨水冲走了。师傅答:冲就冲吧,冲到哪儿都是发芽,随缘。

几天过去了,昔日光秃秃的地上长出了许多新绿,连没有播种到的地方也有小苗探出了头。小和尚高兴地说,师傅,快来看呐,都长出来了。师傅却依然平静如昔地说,应该是这样吧,随喜。

 

一则很老的故事了,不想多说什么,只是写给自己看的。

提醒自己尽量做到随心、随性、随缘、随遇

虽然我知道这很难。

C#常见异常处理类型

 

 

 

 

 

Exception 应用程序执行期间发生错误  
SystemException 系统异常 所有Exception的基类
ArgumentException 当方法提供的任意一个参数无效时,引发此异常  
ArithmeticException 算数导致的错误  
DataException 在使用ADO.NET组件时生成错误 System.Data命名空间提供
FormatException 参数的格式不符合被调用方法的参数规范  
IOException IO错误 System.IO命名空间提供
IndexOutOfRangeException 数组越界  
ArgumentNullException 空引用传递给无效参数的方法时引发 对应JAVA的空指针
DivideByZeroException 0为除数  
OverflowException 运算结果过大,无法以目标格式保存 比如把一个30位数字赋给int
ApplicationException 应用程序执行过程中检测到由应用程序定义的异常  
TargetException 试图调用无效目标时 System.Reflection命名空间提供

 

异常类常用属性

Message 提供引发异常的详细信息
Source 此属性表示导致异常发生地应用程序或对象名
StackTrace 此属性提供在堆栈上所调用方法的详细信息,并首先显示最近调用的方法
InnerException 对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生地异常
返回顶部