首页 > 代码库 > servlet notes1

servlet notes1

【动态网页技术发展】
cgi(common gateway interface)效率低
--->asp(html+js+com)扩展难;com开发难度大,一般是微软开发;安全性低;实现企业级功能困难
--->php(跨平台性良好,多种数据库支持,良好的安全性,免费使用;安装复杂,缺少企业支持) PHP+MySQL+Linux+Apache
--->jsp=HTML+java片段+jsp语法+js(一次编写,到处运行;良好的跨平台性;多种开发工具支持,jbuilder,NetBeans,Eclipse;强大的可伸缩性,jsp+javabean; 入门难,运行机器配置要高,因为jsp是用class常驻内存的方式运行的,效率高,但是需要占更多内存)

【B/S】
优点:开发成本低,管理维护简单,成品升级便利,培训费用低,用户使用方便,出现故障概率小
缺点:安全性低,客户端受限制,有利于管理用户

【servlet】java 服务器端小程序
特点:由服务器端调用和执行;java编写;按照servlet规范开发的;功能强大,几乎可以完成所有网站功能;是jsp基础

文本编辑器:notepad,uedit32
集成开发工具:jbuilder,eclipse,editplus,netbean

【servlet/jsp运行环境】
浏览器:ie,firefox...
WEB服务器(管理servlet):Tomcat,bea weblogic,resin...
数据库:MySQL,access,Oracle...
 
【Tomcat】
免费的开源的servlet容器,sun公司大力支持(图)
功能:1,web服务器  2,jsp容器  3.servlet容器

从bin/startup启动 这样所有消息都会出现,便如调试。

【servlet/jsp网络拓扑图】
开发servlet三种方法:
1.【实现servlet接口】  2.继承Genericservlet 3.继承httpservlet

init:该函数用于初始化servlet(类似于类的构造函数),该函数只会被调用一次(当用户第一次访问该servlet时被调用)

service:用于处理业务逻辑,程序员应该把业务逻辑写在这里。当用户每访问一次该servlet时,都会被调用【ServletRequest req用于获得客户端信息; ServletResponse res用于向客户端返回信息。从res中得到PrintWriter 】

destroy:销毁servlet实例(释放内存)。1.reload该servlet(webapps)2.关闭TOMCAT 2.关机

2.【通过继承GenericServlet开发servlet】
只需要在文件中重写一个service方法。
【code】:
package xby;
 
import javax.servlet.GenericServlet;
import javax.servlet.*;
import java.io.*;

public class HelloGen extends GenericServlet{
 public void service(ServletRequest req,ServletResponse res){
  try{
   PrintWriter pw=res.getWriter();
   pw.println("Hello Gen");
   }
  catch(Exception ex){
   ex.printStackTrace();
   }
  }
 
 }

3.【继承httpservlet】
重写doGet ,doPost方法,目前使用最多的方法。
表单提交数据get请求和post请求的区别:
(1)安全性get<post get提交的数据会在浏览器的地址栏显示;
(2)内容大小上看,get<post get提交的数据不能大于2k 而post提交的数据理论上不受限制 ,但是实际上建议不能大于64k;
(3)请求响应的速度上看:get>post,get要求服务器立即处理请求,而post请求可能形成一个队列请求。
【code】:
【表单标签:<form></form>
功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里】
package xby;

import javax.servlet.http.*;
import java.io.*;

public class Login extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
 try{
  //中文乱码
  res.setContentType("text/html;charset=gbk");
  PrintWriter pw=res.getWriter();
  pw.println("<html>");
  pw.println("<body>");
  pw.println("<h1>登陆界面</h1>");
                //表单提交给哪个servlet
  pw.println("<form action=logincl method=post>");
  pw.println("用户名:<input type=text name=username><br>");
  pw.println("密码:<input type=password name=passwd><br>");
  pw.println("<input type=submit value=http://www.mamicode.com/login>
");
  pw.println("</form>");
  pw.println("</body>");
  pw.println("</html>");
 } 
 catch(Exception ex){
  ex.printStackTrace();
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}
【LoginCL】
package xby;

import javax.servlet.http.*;
import java.io.*;

public class LoginCL extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
 try{
  String u=req.getParameter("username");
  String p=req.getParameter("passwd");
  if(u.equals("xby")&&p.equals("123")){
   res.sendRedirect("wel");
   }
  else{
   res.sendRedirect("login");
  }
 } 
 catch(Exception ex){
  ex.printStackTrace();
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}
【Wel】
package xby;

import javax.servlet.http.*;
import java.io.*;

public class Wel extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
 try{
  PrintWriter pw=res.getWriter();
  pw.println("Welcome");
 } 
 catch(Exception ex){
  ex.printStackTrace();
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}

【同一用户的不同页面如何共享数据】
1.cookie:服务器在客户端保存用户的信息,比如登录名,密码等,就是cookie

2.sendRedirect:该方法将信息传送给另一个页面;速度快;但是只能传送字符串;如果传递时中文,你将得到乱码,需要处理一下
sendRedirect("welcome?username=xby&passwd=123");
【code】
 try{
  String u=req.getParameter("username");
  String p=req.getParameter("passwd");
  if(u.equals("xby")&&p.equals("123")){
   res.sendRedirect("wel?uname="+u+"&upass="+p);
   }
  else{
   res.sendRedirect("login");
  }
 } 

 public void doGet(HttpServletRequest req,HttpServletResponse res){
 res.setContentType("text/html;charset=gbk");
 String u=req.getParameter("uname");
 String p=req.getParameter("upass");
 try{
  PrintWriter pw=res.getWriter();
  pw.println("Welcome");
  pw.println("用户名:"+u+"密码:"+p);
 } 
}

3.隐藏表单:最常用的,也是最简单,但是有时非常有用
<form action=login>
<input type=hidden name=a value=http://www.mamicode.com/b>
</form>

4.session:当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为改浏览器分配一个空间,该空间被这个浏览器独占。
这个空间就是session空间,该空间中的数据默认存在时间为30Min,你也可以修改。
功能:1.网上商城中的购物车 2.保存登录用户的信息 3.将某些数据放到session中,供同一用户的各个页面使用 4.防止用户的非法登陆到某个页面。
可以看作一张表,这张表有2列,每一行就是session的一个属性。每个属性包含2个部分,一个是属性的名字(String),另一个就是它的值(Object)
1.得到session              HttpSession hs=request.getSession(true);
2.向session中添加属性      hs.setAttribute(String name,Object val);
3.从session中得到某个属性  String name=hs.getAttribute(String name);
4.从session中删除某个属性  hs.removeAttribute(String name);
a.session中的属性存在时间默认是30Min,可以在con.web.xml中修改,这个时间指的是用户的发呆时间,而不是累计时间;
b.当某个浏览器访问网站时,服务器会给浏览器分配一个唯一的session id,并以此来区分不同的浏览器(即客户端)
c.因为session的各个属性要占用服务器的内存,因此软件公司都是在迫不得已的情况下才去使用。
【code】
package xby;

import javax.servlet.http.*;
import java.io.*;

public class LoginCL extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
 try{
  String u=req.getParameter("username");
  String p=req.getParameter("passwd");
  if(u.equals("xby")&&p.equals("123")){
   
   //将验证成功的信息写入session
   //1.得到session
   HttpSession hs=req.getSession(true);
   //修改session的存在时间
   hs.setMaxInactiveInterval(20);
   hs.setAttribute("pass","ok");
   res.sendRedirect("wel?uname="+u+"&upass="+p);
   }
  else{
   res.sendRedirect("login");
  }
 } 
 catch(Exception ex){
  ex.printStackTrace();
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}
package xby;

import javax.servlet.http.*;
import java.io.*;

public class Wel extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
 //中文转码
 res.setContentType("text/html;charset=gbk");
 //得到session
 HttpSession hs=req.getSession(true);
 String val=(String)hs.getAttribute("pass");
 if(val==null){
  //非法登陆
  try {
   res.sendRedirect("login");
     }
     catch (Exception ex) {
      ex.printStackTrace();
     }
  
 }
 //接受上一个页面传递的数据
 String u=req.getParameter("uname");
 String p=req.getParameter("upass");
 try{
  PrintWriter pw=res.getWriter();
  pw.println("Welcome");
  pw.println("用户名:"+u+"密码:"+p);
 } 
 catch(Exception ex){
  ex.printStackTrace();
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}
【code】

【Servlet中如何操作数据库】注意sql注入
数据库验证:
【存在sql注入漏洞】package xby;

import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class LoginCL extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
 Connection ct=null;
 Statement sm=null;
 ResultSet rs=null;
 try{
  String u=req.getParameter("username");
  String p=req.getParameter("passwd");
  //连接数据库
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//驱动包
  //获得连接
  ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=xbydb","sa","");//连接数据库的url,数据库的用户名,数据库的密码
  //创建一个Statement
  sm=ct.createStatement();
  rs=sm.executeQuery("select top 1 * from where username=‘"+u+"‘and passwd=‘"+p+"‘");
  
  
  
  if(rs.next()){
   
   //将验证成功的信息写入session
   //1.得到session
   HttpSession hs=req.getSession(true);
   //修改session的存在时间
   hs.setMaxInactiveInterval(20);
   hs.setAttribute("pass","ok");
   res.sendRedirect("wel?uname="+u+"&upass="+p);
   }
  else{
   res.sendRedirect("login");
  }
 } 
 catch(Exception ex){
  ex.printStackTrace();
 }finally{
  try {
   if(rs!=null){
    rs.close();
   }
   if(sm!=null){
    sm.close();
   }if(ct!=null){
    ct.close();
         }
   }
   
     catch (Exception ex) {
      ex.printStackTrace();
     }
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}【】

【sql注入漏洞修改】
package xby;

import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class LoginCL extends HttpServlet{
 //处理get请求
 public void doGet(HttpServletRequest req,HttpServletResponse res){
  
 Connection ct=null;
 Statement sm=null;
 ResultSet rs=null;
 
 try{
  String u=req.getParameter("username");
  String p=req.getParameter("passwd");
  
   
  rs=sm.executeQuery("select top 1 passwd from where username=‘"+u+"‘");
  
  if(rs.next())
  {
   //说明用户存在
   String dbpasswd=rs.getString(1);
   
   if(dbpasswd.equals(p))
   {
    //说明用户真的合法
    HttpSession hs=req.getSession(true);
       //修改session的存在时间
       hs.setMaxInactiveInterval(20);
       hs.setAttribute("pass","ok");
       res.sendRedirect("wel?uname="+u+"&upass="+p);
   }
   else
      {
       res.sendRedirect("login");
         }
  }
  else
  {
   res.sendRedirect("login");
     }
  } 
 catch(Exception ex){
  ex.printStackTrace();
 }finally{
  try {
   if(rs!=null){
    rs.close();
   }
   if(sm!=null){
    sm.close();
   }if(ct!=null){
    ct.close();
         }
   }
   
     catch (Exception ex) {
      ex.printStackTrace();
     }
 }
 }
 //处理post请求
 public void doPost(HttpServletRequest req,HttpServletResponse res){
 this.doGet(req,res);
 }
}
【数据库程序设计】
一般通过JDBC(Java Database Connectivity)的驱动程序实现对底层数据库的操作。分三步:
1.连接数据库
2.不断执行SQL语句和处理查询结果
3.关闭连接
JDBC规定了一套访问数据库的API,具体实现则依赖具体的JDBC驱动程序。

【获得驱动】:
Class.forName("驱动程序名"); //Class的完整类名为java.lang.Class 加载了驱动后,就可以开始连接数据库

【连接数据库】:
Connection ct=DriverManager.getConnection("url","user","password"); //该成员方法的作用是与指定的数据库建立连接,并返回建立起来的连接。这样java程序就与数据库管理系统建立了传递SQL语句的操作通道。

【创建SQL语句实例对象】(并进行数据处理):
Statement st=ct.createStatement();
ResultSet rs=st.executeQuery("SQL语句");

【关闭数据库】
xxx.close();

 

【servlet中插入图片】
在webapps文件夹下,建立一个文件夹image,然后将图片拷贝到文件下。在servlet中添加:<img src="http://www.mamicode.com/image/图片名"/>

【分页技术】
int pageSize:每页多少页记录
int pageNow:希望显示第几页
int pageCount:一共多少页
int rowCount:一共多少条记录
【代码实现】

【Cookies】

【java中的extends和implements】
 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承。
 JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了
 比如class A extends B implements C,D,E

【框架问题初涉】

 

servlet notes1