1. 什么是B/S技术?B/S技术与C/S技术的区别?
C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。浏览器通过Web Server 同数据库进行数据交互。
2.什么是URL?URL由几部分组成?
统一资源定位地址(Uniform Resource LocatorURL)是一个地址命名标准。其内容是一个字符串用于指定WWW服务程序的远程服务器中的某个Web页也可用于指向FTP、WAIS和Gopher服务器存储的信息资源。
一个URL主要包括3部分:资源访问时的交互协议、主机域名(其中可含端口号)和资源文件的标识(目录路径和文件名)。目前常用的有FTP服务、WWW服务、邮件服务、新闻组服务等。
3.JSP注释分为几种情况?有何区别?(请写出具体事例)
(1).JSP页面中的HTML注释
SP页面中的HTML注释使用“<!—”和“-->”创建,它的具体形式如下所示:
<!-- 注释内容 -->
当它出现在JSP页面时,微蘑菇将不被原样地加入JSP响应中,而且将出现在生成的HTML代码中,此代码将发送给浏览器;然后有浏览器负责忽略此注释。由于 HTML注释不是简单地被JSP忽略,因此它们可以包含内嵌的动态内容。HTML注释内的JSP表达式将被计算和执行,并送给浏览器的响应。
(2).JSP页面中的普通注释
JSP页面中的普通注释是指以下两种样式的注释方法:
<% // 注释内容 %> <% /* 注释内容 */ %>
以上两个注释都将由浏览器忽略。
(3).JSP页面中的隐藏注释
JSP语句中的隐藏注释嵌入在JSP程序的源代码中,使用隐藏注释的目的并不是提供给用户的,它可以达到两种目的:JSP语句中的隐藏注释目的之一,是为 了程序设计和开发人员阅读程序的方便,增强程序的可读性。一个优秀程序员的良好注释风格对于整个项目开发组以及长远使用来说,很重要。
JSP语句中的隐藏注释目的之二,是在增强程序可读性的同时又顾及程序系统的安全性,用户如果通过Web浏览器查看该JSP页面,看不到隐藏注释中注释的内容。
JSP页面中的隐藏注释使用“<%--”和“--%>”创建,它的具体形式如下所示:<%-- 注释内容 --%>
4.JSP页面组成包括哪些内容?
jsp页面主要由6大元素组成:指令、注释、脚本、声明、表达式、静态内容(就是html不讨论了)
1.指令
page指令、include指令、taglib指令
page指令格式:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
常用属性:language、import、pageEncoding
2.注释
jsp的注释分为2种:html的注释和脚本的注释
html注释:
<!--html注释--> 客户端可见 <%--html的注释--%> 客户端不可见
脚本注释:
// 单行注释 /**/多行注释
3.脚本(在jsp中可执行的java代码)
格式:
<% java代码%>
4.声明(定义变量和方法)
格式:
<%! java代码%>
5.表达式
<%= 表达式%> 不以分号未结束
最后补充一下jsp页面的生命周期
用户发出请求,如果是第一次请求jsp文件就会被转化为servlet生成字节码文件,然后被解释执行,如果不是第一次请求,就会直接解释执行已经生成过的字节码文件
5.JSP是如何响应客户端的请求并向客户端输出信息?
JSP内置对象response
response对象与request对象相对应,它用于响应客户请求并向客户端输出信息。
response常用方法:void sendRedirect(String location)。这个方法用来将请求重定向到一个不同的URL。
例如:
response.sendRedirect(“xinxin.jsp”);
以上,客户端重新建立链接,URL地址发生了改变。
使用request的getRequestDispatcher()方法进行页面跳转时,客户端并没有重新建立新的链接,客户端的URL地址不会发生改变。
6.什么是重定向?什么是转发?区别是什么?
请求转发:
请求转发,即request.getRequestDispatcher().forward(),是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端;
请求重定向:
请求重定向,即response.sendRedirect(),是一种客户端行文,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。
转发是服务器行为,重定向是客户端行为
1.转发在服务器端完成的;重定向是在客户端完成的
2.转发的速度快;重定向速度慢
3.转发的是同一次请求;重定向是两次不同请求
4.转发不会执行转发后的代码;重定向会执行重定向之后的代码
5.转发地址栏没有变化;重定向地址栏有变化
6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
在servlet中调用转发、重定向的语句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp
转发过程:客户浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
重定向,其实是两次request
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
7.JSP如何实现数据库访问?请写出相应步骤。
使用JDBC:
- 选择数据库:加载数据库驱动
- 连接数据库
- 创建数据库查询
- 获取查询结果
- 关闭查询和连接
/**
* 创建连接
*/
public static void createConn() {
try {
conn = null;
String url = "jdbc:mysql://localhost:3306/demo2";
String user = "root";
String password = "123456";
// 1. 选择数据库:加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 连接数据库
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动没有找到");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void exeQuery(String name) {
PreparedStatement ps = null;
try {
// 创建数据库查询
ps = conn.prepareStatement("SELECT id,name,code,clazz FROM demo1 WHERE name LIKE ?");
ps.setString(1, name + "%");
// 获取查询结果
ResultSet rs = ps.executeQuery();
// 遍历结果
while (rs.next()) {
int id = rs.getInt("id");
String name1 = rs.getString("name");
String code = rs.getString("code");
String clazz = rs.getString("clazz");
System.out.println("id="+id+",name="+name1+",code="+code+",clazz="+clazz+"");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 5. 关闭查询
try {
if (null != ps) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void exeUpdate(String name, String code, String clazz) {
PreparedStatement ps = null;
try {
// 创建数据库查询
ps = conn.prepareStatement("INSERT INTO demo1(name,code,clazz) VALUES(?,?,?)");
ps.setString(1, name);
ps.setString(2, code);
ps.setString(3, clazz);
// 获取查询结果
int i = ps.executeUpdate();
System.out.println("一共执行了" + i + "条");
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 5. 关闭查询
try {
if (null != ps) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭连接
*/
public static void closeConn() {
// 5. 关闭连接
try {
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
8. 0.6332的数据类型是?(请写出具体类型)
double 浮点
9.abstract class 和interface 有什么区别?
含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract
方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class
类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静
态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract
类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口
中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象
的普通方法。
4. 抽象类中的抽象方法的访问类型可以是 public,protected 和(默认类型,虽然
eclipse 下不报错,但应该也不行),但接口中的抽象方法只能是 public 类型的,并且默认即
为 public abstract 类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任
意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类
型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类
在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个
典型应用,假设某个项目的所有 Servlet 类都要用相同的方式进行权限判断、记录访问日志
和处理异常,那么就可以定义一个抽象的基类,让所有的 Servlet 都继承这个抽象基类,在
抽象基类的 service 方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中
只是完成各自的业务逻辑代码,伪代码如下:
public abstract classBaseServlet extends HttpServlet{
public final void service(HttpServletRequest request,HttpServletResponse
response) throws IOExcetion,ServletException {
记录访问日志
进行权限判断
if(具有权限){
try{
doService(request,response);
}
catch(Excetpion e) {
记录异常信息
}
}
}
protected abstract void doService(HttpServletRequest
request,HttpServletResponse response) throws IOExcetion,ServletException;
//注意访问权限定义成 protected,显得既专业,又严谨,因为它是专门给子类用的
}
public class MyServlet1 extendsBaseServlet
{
protected voiddoService(HttpServletRequest request, HttpServletResponse response)
throwsIOExcetion,ServletException
{
本 Servlet 只处理的具体业务逻辑代码
}
}
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,
最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普
通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,
接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功
底。