- 浏览: 210664 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
liu47a:
1.首尾相连2.8天3.19990014.“我不会被烧死,我将 ...
思维测试题一 -
liu47a:
3 1999001
思维测试题一 -
拓子轩:
...
servlet基础 -
ss321pp076:
总结的很全面但如果有的地方写得更加详细对初学者来理解帮助要大些 ...
servlet基础 -
拓子轩:
Mongodb数据库入门
一. 背景知识
1. 常用的Web服务器
~ IIS
~ Apache
~ Tomcat
2. 通常的动态网页技术
~ CGI (Common GateWay Interface)
~ API常用的有(NSAPI, ISAPI)
~ ASP (Active Server Page)
~ PHP (Personal Home Page) ----------->LAMP(Linux+apache+mysql+php)
~ JSP/Servlet (Java Server Page)
二. Tomcat的安装与配置
1. 解压到相应目录。如C:\tomcat
2. tomcat6的目录结构
~bin: 包含tomcat可执行的二进制文件。常用的有startup.bat, shutdown.bat
~conf: 包含tomcat的配置文件。如context.xml, server.xml, web.xml
~lib: 包含tomcat所需的Jar文件。
~logs: 日志文件
~temp: 临时文件
~webapps: web应用主目录
~work: 保存缓存文件
3. tomcat的配置
~配置JAVA_HOME系统环境变量,变量值指向安装的JDK路径。如C:\jdk1.6.0_17
~更改端口:打开conf\server.xml, 可把默认8080端口改成80(也可保持默认8080端口不变),在此不变。
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
~自动加载: 打开conf\context.xml, 在Context属性里添加属性reloadable="true"
<Context reloadable="true">
三. HTTP协议基础
1. HTTP(Hypertext Transfer Protocol, 超文本传输协议)
2. HTTP是以明文方式发送数据的
3. 用于从WWW服务器传输超文本到本地浏览器的传输协议
4. 现在广泛使用的版本HTTP/1.1
四. Servlet简介
1. Servlet是服务器小应用程序
2. 用来完成B/S架构下,客户端请求的响应处理
3. 平台独立,性能优良,能以线程方式运行
4. Servlet API为Servlet提供了统一的编程接口
5. Servlet一般在容器中运行
6. 常见的Servlet容器
~Tomcat
~Jetty/Resin
五. Web Application的概念
1. Web Application Name
1.1 WEB-INF
~web.xml: 该web app的配置文件
~lib目录: 该web app用到的库文件
~classes目录: 存放编译好的servlet
1.2 META-INF
~存放该web app的上下文信息,符合J2EE标准
2. Web Application可以直接放在webapp下面
3. 也可以通过配置文件指定到其它目录<host>里面
<Context path="/虚拟路径名" docBase="目录位置" debug="0" reloadable="true"/>
六. Servlet应用程序实例
1. 建立所需的目录结构
~在tomcat安装目录的子目录webapps下新建文件夹hello
~在hello文件夹下新建WEB-INF文件夹和index.html文件
~在WEB-INF文件夹下新建classes和lib文件夹,以及web.xml文件
2. 编写HelloWorldServlet.java,并把编译好的class文件放到classes目录下
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;
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=gbk");
PrintWriter out = response.getWriter();
out.println("<html><head></head><body><center><font color='red'>
HelloWorldServlet</font></center></body></html>");
out.flush();
out.close();
}
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
3. 配置web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello.do</url-pattern>
</servlet-mapping>
</web-app>
4. 编写index.html
<html>
<head>
<title>this is a test page</title>
</head>
<body>
<form method="post" name="form1" action="/hello/hello.do" >
用户名:
<input type="text" name="username" size=20>
<br>
密码:
<input type="password" name="password" size=20>
<br>
<input type="submit" name="submit" value="提交">
<input type="reset" name="reset" value="重置">
</form>
</body>
</html>
5. 在浏览器输入http://localhost:8080/hello/index.html点击提交按钮或者直接输入http://localhost:8080/hello/hello.do
页面输出HelloWorldServlet
6. 注意
~浏览器地址栏输入的访问路径区分大小写,hello.do不能写成Hello.do
~访问的路径由 <url-pattern>指定
~ <url-pattern>中的/hello.do表示的是hello这个web应用下的hello.do
~表单中action="/hello.do"表示访问域名下的hello.do,所以应写出action="/hello/hello.do"或者action="hello.do"(相对index.html的路径)
七. Servlet的生命周期
1. 生命全过程
~加载 ClassLoader
~实例化 new
~初始化 init(ServletConfig)
~处理请求 service doGet doPost
~退出服务 destory()
2. 只有一个对象
3. API中的过程:
~init() //只执行一次,第一次初始化的时候
~public void init(ServletConfig config) throws ServletException
~service()
~public void service(ServletRequest request,ServletResponse response) throws ServletException, java.io.IOException
~destory() //webapp 退出的时候
~public void destory()
八. 为什么有两个init()方法
1. void init(ServletConfig config): Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
2. void init(): A convenience method which can be overriden so that there's no need to call super.init(config).
3. ServletConfig 用法示例
3.1 把以下内容copy到web.xml文件中的<servlet></servlet>标签内.
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>翁子轩</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>23</param-value>
</init-param>
</servlet>
3.2 在HelloServlet.java文件的doGet方法体内添加如下代码:
response.setContentType("text/html;charset=gbk");
PrintWriter out = response.getWriter();
String s = this.getServletConfig().getInitParameter("name");
String s1 = new String(s.getBytes("ISO-8859-1"),"GBK");
out.println("<html><head>HelloServlet</head><body>"+s1+"</body></html>");
out.flush();
out.close();
3.3 在浏览器中输入http://localhost:8080/hello/hello.do, 页面输出结果为“HelloServlet翁子轩”
3.4 要对配置文件中的参数进行遍历,把上面的代码改写如下:
response.setContentType("text/html;charset=gbk");
PrintWriter out = response.getWriter();
Enumeration e = this.getServletConfig().getInitParameterNames();
for(;e.hasMoreElements();) {
String name = e.nextElement().toString();
String value = this.getServletConfig().getInitParameter(name);
value = new String(value.getBytes("ISO-8859-1"),"GBK");
out.println(value);
}
out.flush();
out.close();
//页面输出结果为"23 翁子轩"
九. 从页面中获取参数
1. 解决参数提交的乱码问题
1.1 解决post方式提交内容的乱码,且一定要写在存取第一个参数之前
request.setCharacterEncoding("GBK");
1.2 解决get方式提交内容的乱码。修改server.xml,把URIEncoding设定为"GBK",然后重启tomcat.
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK" />
1.3 从页面中获取参数
request.getParameter("username");
十. Cookie
1. 服务器可以向客户端写内容
2. 只能是文本内容
3. 客户端可以阻止服务器写入
4. 只能拿自己webapp写入的东西
5. Cookie分为两种
~属于窗口/子窗口(放在内存中的)
~属于文本(有生命周期的)
6. 一个servlet/jsp设置的cookies能够被同一个路径下面或者路径下面的servlet/jsp读到(路径=URL)(路径!=真实文件路径)
7. 向客户端写入Cookie
for(int i=0; i<3; i++) {
Cookie cookie = new Cookie("Session-Cookie-"+i, "Cookie-Value-S"+i);
response.addCookie(cookie); //未设置生命周期的Cookie只存在于内存中
cookie = new Cookie("Persistent-Conkie-"+i, "Cookie-Value-P"+i);
cookie.setMaxAge(3600); //设置Cookie的生命周期
response.addCookie(cookie);
}
8. 读取客户端的Cookie
Cookie[] cookies = request.getCookies();
if(cookies !=null) {
Cookie cookie;
for(int i=0; i<cookies.length; i++) {
cookie = cookies[i];
out.println(cookie.getName());
out.println(cookie.getValue());
}
}
十一. Session
1. 服务器的一块内存(存key-value)
2. 和客户端窗口对应(子窗口)(独一无二)
3. 客户端和服务器有对应的SessionID
4. 客户端向服务器端发送SessionID的时候有两种方式:
~cookei(内存cookie)
~rewriten URL
response.encodeURL(request.getRequestURL().toString())
5. 浏览器禁掉cookie, 就不能使用session(使用cookie实现的session)
6. 如果想安全的使用session(不论客户端是否禁止cookie). 只能使用URL重写(大大增加编程负担), 所以很多网站要求客户端打开cookie.
7. ServletContext: ServletContext application = this.getServletContext();
十二. Servlet连接Mysql数据库
1. 启动mysql,并在其中建立相应的数据库和表
2. 把jdbc的驱动复制到lib目录下(mysql-connector-java-3.1.13-bin.jar)
3.
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
out.println("<table border=1>");
out.println("<tr><td>Content:</td></tr>");
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/bbs?user=root&password=12345678");
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from article");
while(rs.next()){
out.println("<tr>");
out.println("<td>" + rs.getString("cont") + "</td>");
out.println("</tr>");
}
out.println("</table>");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt= null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
4. 注意:仔细检查连接串;确认有没有这个表;如果出错,先去后台看报错信息;确认mysql以及启动;把jdbc的驱动复制到lib目录下
十三. Servlet中使用javabean
1. 广义的javabean = 普通java类
狭义的javabean = 符合Sun JavaBean标准的类
2. 在Servlet中使用Bean和在通常程序中使用Bean类似
~属性名称第一个字母必须小写,一般private
~一般具有getters and setters
~要具有一个参数为空的构造方法
~但Bean不应具有GUI表现
~一般是用来实现某一业务逻辑或取得特定结果
十四. JSP简介
1. JSP----Java Server Pages
2. 拥有servlet的特性与优点(本身就是一个servlet)
3. 直接在HTML中内嵌JSP代码
4. JSP程序由JSP Engine先将它转换Servlet代码,接着将它编译成类文件载入执行
5. 只有当客户端第一次请求JSP时,才需要将其转换、编译
6. 优点:
~性能优良----优于CGI, PHP, ASP
~平台无关性----操作系统无关,Web服务器无关
~可扩展性----tag的扩展机制,简化页面开发
十五. JSP编程----基本语法
1. JSP传统语法
1.1 Declaration
~基本语法:<%! %>
~说明:在此声明的变量、方法都会被保留成唯一的一份,直到JSP程序停止执行
~例如:
<%!
int i;
public void setName() {... ...}
%>
1.2 Scriptlet
~基本语法:<%程序代码区%>
~可以放入任何的Java程序代码
~例如:
<%
for(int i=0; i<10; i++) {... ...}
%>
1.3 Expression
1.4 Comment
1.5 Directives
~Directive(编译指令)相当于在编译期间的命令
~格式:<%@Directive 属性="属性值"%>
~常见的Directive:
page:
$ 指明与JSP Container的沟通方式
$ 基本格式:
<%@page language="script language"
extends="className"
import="importList"
buffer="none|kb size" ----none:不缓冲,默认8k
session="true|false" ----是否可以使用session,默认true
autoFlush="true|false" ----缓冲器是否自动清除,默认true
isThreadSafe="true|false" ----默认false(永远不要设成true)
info="info Text" ----任何字符
errorPage="errorPageUrl"
isErrorPage="true|false"
contentType="contentTypeInfo"
pageEncoding="gb2312"
%>
include
$ 将指定的JSP程序或者HTML文件包含进来
$ 格式:<%@include file="fileURL" %>
$ JSP Engine会JSP程序的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。
(原封不动的把文件的代码copy到该位置,然后进行转换和编译,只生成一个java和class)
$ 限制:不能向fileURL中传递参数, 如不能abc.jsp?user=aaa
taglib
1.6 Action动作指令
~Action(动作指令)在运行期间的命令
~常见的:
jsp:useBean
$ jsp:setProperty
$ jsp:getProperty
jsp:include
$ <%@include和jsp:include的区别
-------------------------------------------------------------------------------------------------------------------
<%@include file="date.jsp"%> <jsp:include page="date.jsp" flush="true"
-------------------------------------------------------------------------------------------------------------------
include编译指令是在JSP程序的转换 而include指令在转换时期是不会被编译的,
时期就将file属性所指定的程序内容 只有在客户端请求时期如果被执行到才会被
嵌入,然后再编译执行 动态的编译载入
-------------------------------------------------------------------------------------------------------------------
只生成一个class文件 多个
-------------------------------------------------------------------------------------------------------------------
include不能带参数 <jsp:include>可以
-------------------------------------------------------------------------------------------------------------------
同一个request对象 不同的request对象,可以取得包含它的页面
的参数,并添加了自己的参数
-------------------------------------------------------------------------------------------------------------------
jsp:forward
$ jsp:param
$ forward和sendredirect的区别
-------------------------------------------------------------------------------------------------------------------
Sendrediret Forward
-------------------------------------------------------------------------------------------------------------------
是不同的request 虽然是不同的对象,但是可以取到上一个
页面的内容
-------------------------------------------------------------------------------------------------------------------
send后的语句会继续执行,除非return farward后的语句不会继续发送给客户端
-------------------------------------------------------------------------------------------------------------------
速度慢 速度快
-------------------------------------------------------------------------------------------------------------------
需要到客户端的往返,可以转到任何页面 服务器内部转换
-------------------------------------------------------------------------------------------------------------------
地址栏有变化 地址栏没有变化
-------------------------------------------------------------------------------------------------------------------
可以传参数,直接写在url后面 可以传参数
-------------------------------------------------------------------------------------------------------------------
/代表的是http://127.0.0.1/ /代表的是http://127.0.0.1/hello,并且只能
以/开头
-------------------------------------------------------------------------------------------------------------------
jsp:plugin
$ 嵌入applet
1.7 内置对象
2. JSTL
3. JSF
十六. JSP中使用javabean
1. jsp:useBean各项参数含义
~id: 对象实例名称
~scope: Bean作用的范围,默认为page, 对整个jsp页面有效
~class: Bean类名称(全名)
~type: Bean实例类型,可以是本类,或其父类,或实现的接口,默认为本类
2. Scope各项参数的意义
~page: 仅涵盖使用JavaBean的页面
~request: 有效范围仅限于使用JavaBean的请求
~session: 有效范围在用户整个连接过程中(整个会话阶段均有效)
~application: 有效范围涵盖整个应用程序。也就是对整个网站均有效
十七. 乱码问题
1. 场合:页面本身有中文的时候
解决办法:
servlet: response.setContentType("text/html;charset=gbk");
Jsp: <%@page contentType="text/html;charset=gb2312"%>
注意:一定要写在PrintWriter out = response.getWriter(); 之前
2. 场合:解决get方式的乱码问题
解决办法:修改server.xml------->URIEncoding="GBK"
3. 场合:解决post方式提交内容的乱码
解决办法:request.setCharacterEncoding("GBK");
注意:一定要写在存取第一个参数之前,不要调用response.setCharcterEncoding("GBK");
4. 场合:<jsp:param name="user" value="<%=s%>"/>, url地址包含中文参数
解决办法:<%request.setCharacterEncoding("GBK");%>
评论
但如果有的地方写得更加详细对初学者来理解帮助要大些,比如
解决get方式的乱码问题
解决办法:修改server.xml------->URIEncoding="GBK"
可以直接将配置节点写出来:加在“Connecter”的属性中
再比如讲了Session和Cookie,可以讲讲两者的区别(Session是基于Cookie的),如果客户端强制关闭禁止所有Cookie就只能使用encodingURL了
以上建议唐突了,勿介意,楼主可以把这些写一个专题,不仅自己加深细节的理解,也帮助初学者理解哈!
发表评论
-
笔面
2012-08-29 21:49 9131. 什么数据适合放在缓存中 a. 很少被修改的数据 b. ... -
oracle笔记
2012-01-22 09:27 1043数据库的基本概念1.数 ... -
DOM笔记
2012-01-22 09:23 1027DOM一. DHTML1. JavaScript将 ... -
oracle基础
2012-01-21 22:54 7783个默认的用户(oracle9) sys chang ... -
Python基础
2012-01-21 09:47 9191.提示用户输入 input('Enter an integ ... -
WEB开发笔记
2012-01-19 20:04 1212第一章 Java Web开发工具的安装与使用1.安装JDK 下 ... -
AJAX学习笔记
2012-01-19 20:05 10801.基于标准的一些好习惯1.1 标签名要小写1.2 标签必须关 ... -
XML
2012-01-10 22:01 878什么是配置文件为什么 ... -
java web开发
2012-01-10 21:42 1296第一章 Java Web开发工具的安装与使用1.安装JDK 下 ... -
HTTP协议详解
2012-01-10 21:30 1235HTTP简介1.WEB浏览器与WEB ... -
JPA开发
2012-01-10 21:20 21941. 什么是JPA 1. JPA(Java Persiste ... -
Linux学习笔记
2011-12-25 21:30 1097一、常用命令1.lsls / 查 ... -
jdbc基础
2011-12-24 07:24 11781.JDBC简介1.1 JDBC(Java Data Base ... -
Eclipse常用快捷键
2011-12-22 22:45 5891. 【ALT+/】 此快捷键为 ...
相关推荐
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,
SQLite3的向量扩展库,windows dll,版本0.1.5
基于C++实现(控制台)商品库存管理系统