【动态网页技术发展】
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=login></br>");
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=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="./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
【框架问题初涉】