- tomcat目录结构
1) bin目录 存放启动和关闭服务器的一些脚本(命令)
2) common目录 共享(部署在该服务器上的所有程序都可以使用)的一些jar 包
3) conf目录 存放服务器的一些配置文件
4) webapps目录 部署目录
5) work目录 服务器运行时,生成的一些临时文件 - 将tomcat目录common\lib下的servlet-api.jar拷贝到新建目录下
写一个java类HelloServlet.java(编译这个类需要servlet-api.jar包)
编译java类:
编译命令参数含义:
-cp 表示告诉Java编译器去哪里找需要的class 文件(到servlet-api.jar 的jar 包中找)
-d . 表示将编译生成的字节码文件放入当前文件夹下
-cp 表示告诉Java编译器去哪里找需要的class 文件(到servlet-api.jar 的jar 包中找)
-d . 表示将编译生成的字节码文件放入当前文件夹下
3.在对话框“Project Deployments”对话框有4个按钮,常用的为
“Add”按钮 在tomcat服务器上增加新应用“Remove”按钮 删除tomcat服务器上的新应用
“Redeploy”按钮 重新部署该应用,一般每次修改后都需要重新部署一下
4.常见错误
1) 要实现Servlet接口或者继承HttpServlet.
2) service()方法名称、参数、异常类型要写对!
3) web.xml配置文件中,类名不要写错!servlet-name不要写错
4) 在浏览器输入访问地址时,地址不要写错。
应该按照http://ip:port/appname/servlet的url-pattern去访问。
5) 记得先部署,记得服务器必须已经运行了,不然不能访问
6) 如果报500错误,一般是你的程序写错了,
如果报404错误,访问地址有错。
如果是405错误,请检查你的service方法名,包括方法参数等
5.请求方式(get/post)
请求资源路径(端口号之后的内容,比如/appname/servlet)
消息头的样式,比如: content-type= text/html;
get/post方式的区别
get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;
请求资源路径(端口号之后的内容,比如/appname/servlet)
消息头的样式,比如: content-type= text/html;
get/post方式的区别
get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;
post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交。
安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会
将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。 给表单设置method="post"。
表单处理
6. 如何获得请求参数值
1) String request.getParameter(String paraName);
要注意的问题: 如果paraName不实际的请求参数名不一致,则返回null。
如果没有输入参数值,则返回""。
2) String[] request.getParameterValues(String paraName);
用在有多个请求参数名相同的情况下使用。
比如 ?interest=fishing&interest=cooking
如何处理表单中的中文(难点)
1) 浏览器会如何对表单中的数据进行编码?
当表单采用post方式提交时,浏览器会按照打开该表单所在的页面的编码来对表单中的
数据进行编码。
2) 在html 文件当中,添加以下代码的作用
<meta http-equiv="content-type" content="text/html;charset=utf-8">
作用1:
模拟http消息头(content-type),让浏览器以utf-8的编码格式来打开该页面(要确
保html文件本身确定是使用 utf-8保存的)。
作用2:
确保浏览器按指定的编码来对表单中的数据进行编码。
中文乱码解决方案
step1:
在html文件中,添加
<meta http-equiv="content-type" content="text/html;charset=utf-8">
另外,表单的提交方式必须是post。
step2:
在服务器端,使用servlet读取表单中的请求参数时:
request.setCharacterEncoding("utf-8");
这行代码的作用:设置解码时的编码格式。
step3:
如果servlet输出中文,要添加如下代码。
response.setContentType("text/html;charset=utf-8");
这行代码的作用:
作用1:
指定out.println输出时所使用的编码。
作用2:
生成一个消息头content-type:text/html;charset=utf-8
告诉浏览器,返回的数据类型是html,编码是 utf-8。这样,浏览器一定会以指定的编码来显示该页面。
访问MySql数据库步骤
1) 将jdbc驱动程序相关的jar 包 copy 到WEB-INF/lib下
2) 在servlet代码当中,使用jdbc访问数据库,要注意如何处理异常。
3) 如何配置错误处理页面
因为在访问数据库时,可能会产生系统异常,可以为服务器配置一个错误处理页面,
这样,当发生系统异常时,服务器会将对应的错误处理页面显示给用户。
step1 写一个错误处理页面error.html
step2 在web.xml文件中,配置
<error-page>
<error-code>500</error-code>
<location>/error.html</location>
</error-page>
安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会
将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。 给表单设置method="post"。
表单处理
6. 如何获得请求参数值
1) String request.getParameter(String paraName);
要注意的问题: 如果paraName不实际的请求参数名不一致,则返回null。
如果没有输入参数值,则返回""。
2) String[] request.getParameterValues(String paraName);
用在有多个请求参数名相同的情况下使用。
比如 ?interest=fishing&interest=cooking
如何处理表单中的中文(难点)
1) 浏览器会如何对表单中的数据进行编码?
当表单采用post方式提交时,浏览器会按照打开该表单所在的页面的编码来对表单中的
数据进行编码。
2) 在html 文件当中,添加以下代码的作用
<meta http-equiv="content-type" content="text/html;charset=utf-8">
作用1:
模拟http消息头(content-type),让浏览器以utf-8的编码格式来打开该页面(要确
保html文件本身确定是使用 utf-8保存的)。
作用2:
确保浏览器按指定的编码来对表单中的数据进行编码。
中文乱码解决方案
step1:
在html文件中,添加
<meta http-equiv="content-type" content="text/html;charset=utf-8">
另外,表单的提交方式必须是post。
step2:
在服务器端,使用servlet读取表单中的请求参数时:
request.setCharacterEncoding("utf-8");
这行代码的作用:设置解码时的编码格式。
step3:
如果servlet输出中文,要添加如下代码。
response.setContentType("text/html;charset=utf-8");
这行代码的作用:
作用1:
指定out.println输出时所使用的编码。
作用2:
生成一个消息头content-type:text/html;charset=utf-8
告诉浏览器,返回的数据类型是html,编码是 utf-8。这样,浏览器一定会以指定的编码来显示该页面。
访问MySql数据库步骤
1) 将jdbc驱动程序相关的jar 包 copy 到WEB-INF/lib下
2) 在servlet代码当中,使用jdbc访问数据库,要注意如何处理异常。
3) 如何配置错误处理页面
因为在访问数据库时,可能会产生系统异常,可以为服务器配置一个错误处理页面,
这样,当发生系统异常时,服务器会将对应的错误处理页面显示给用户。
step1 写一个错误处理页面error.html
step2 在web.xml文件中,配置
<error-page>
<error-code>500</error-code>
<location>/error.html</location>
</error-page>
7.//访问数据库
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager
.getConnection(
"jdbc:mysql://localhost:3306/jd1109db2",
"root","root");
PreparedStatement prep =
conn.prepareStatement(
"insert into t_emp(name,salary,age) " +
"values(?,?,?)");
<servlet>
<servlet-name>modifyEmpServlet</servlet-name>
<servlet-class>web.ModifyEmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addEmpServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
8.DAO:data access object(DAO),封装了数据访问逻辑,调用者(一般是业务逻辑模块)不需要了
解底层的数据访问细节就可以实现数据访问。这样一来,当底层的数据访问细节发生改变,不会影响到调用者。
如何写一个dao
a. 实体类
为了方便处理数据库中的记录,可以定义与记录对应的实体类,即可以将数据库中的某
条记录转换成一个实体类的实例。
比如 Employee类,提供id,name,salary,age 属性及相关的get/set方法,我们可以将
t_emp表中的记录转化成一个Employee对象。
b. dao接口
声明一些数据访问方法,这些方法不要涉及具体的技术。
比如:
EmployeeDAO接口,声明了:
public void save(Employee e) throws SQLException;
这种方式不好,因为出现了jdbc的异常类,这就要求实现该方法只能使用jdbc。
换一种方式来声明,更好
public void save(Employee e) throws Exception;
public List<Employee> findAll() throws Exception;
c. dao实现类
采用具体的技术实现dao 接口。
比如:
使用jdbc实现EmployeeDAO接口,写一个类EmployeeDAOJdbcImpl。
d. dao工厂(工厂模式)
工厂类:封装了对象的创建细节,为调用者提供符合要求的对象。
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager
.getConnection(
"jdbc:mysql://localhost:3306/jd1109db2",
"root","root");
PreparedStatement prep =
conn.prepareStatement(
"insert into t_emp(name,salary,age) " +
"values(?,?,?)");
<servlet>
<servlet-name>modifyEmpServlet</servlet-name>
<servlet-class>web.ModifyEmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addEmpServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
8.DAO:data access object(DAO),封装了数据访问逻辑,调用者(一般是业务逻辑模块)不需要了
解底层的数据访问细节就可以实现数据访问。这样一来,当底层的数据访问细节发生改变,不会影响到调用者。
如何写一个dao
a. 实体类
为了方便处理数据库中的记录,可以定义与记录对应的实体类,即可以将数据库中的某
条记录转换成一个实体类的实例。
比如 Employee类,提供id,name,salary,age 属性及相关的get/set方法,我们可以将
t_emp表中的记录转化成一个Employee对象。
b. dao接口
声明一些数据访问方法,这些方法不要涉及具体的技术。
比如:
EmployeeDAO接口,声明了:
public void save(Employee e) throws SQLException;
这种方式不好,因为出现了jdbc的异常类,这就要求实现该方法只能使用jdbc。
换一种方式来声明,更好
public void save(Employee e) throws Exception;
public List<Employee> findAll() throws Exception;
c. dao实现类
采用具体的技术实现dao 接口。
比如:
使用jdbc实现EmployeeDAO接口,写一个类EmployeeDAOJdbcImpl。
d. dao工厂(工厂模式)
工厂类:封装了对象的创建细节,为调用者提供符合要求的对象。
数据访问逻辑:DAO(Data Access Object)
表示逻辑:和界面相关的,比如out.print()
表示逻辑:和界面相关的,比如out.print()
9.处理请求资源路径
servlet容器如何处理请求资源路径?
什么是请求资源路径?
比如输入 http://ip:port/appname/abc.html/appname/abc.html 称为请求资源路径
Servlet容器处理请求资源路径的步骤
step1
依据/appname查找该应用对应的文件夹(比如查找webapps 下面的文件夹是否与其匹配)。
step2
在找到的文件夹下面,找到web.xml文件,然后使用<url-pattern>与/abc.html 去做匹配。
匹配规则:
1) 精确匹配: 即要求<url-pattern>与/abc.html完全一致。
2) 通配符匹配: 使用"*"代表任意的字符串。
比如在<url-pattern>中使用:
/* 表示任意字符串
/abc/* 表示有/abc/的字符串
3) 后缀匹配: 不能使用“/"开头,要求"*.任意的字符串"。
比如
*.do 要求以.do结尾
*.action 要求以.action结尾
step3
尝试查找/abc.html文件,如果找到,则返回该文件,找不到,则返回404状态码。
servlet容器如何处理请求资源路径?
什么是请求资源路径?
比如输入 http://ip:port/appname/abc.html/appname/abc.html 称为请求资源路径
Servlet容器处理请求资源路径的步骤
step1
依据/appname查找该应用对应的文件夹(比如查找webapps 下面的文件夹是否与其匹配)。
step2
在找到的文件夹下面,找到web.xml文件,然后使用<url-pattern>与/abc.html 去做匹配。
匹配规则:
1) 精确匹配: 即要求<url-pattern>与/abc.html完全一致。
2) 通配符匹配: 使用"*"代表任意的字符串。
比如在<url-pattern>中使用:
/* 表示任意字符串
/abc/* 表示有/abc/的字符串
3) 后缀匹配: 不能使用“/"开头,要求"*.任意的字符串"。
比如
*.do 要求以.do结尾
*.action 要求以.action结尾
step3
尝试查找/abc.html文件,如果找到,则返回该文件,找不到,则返回404状态码。
访问http://localhost:8080/web04/aabbccddeedd,404
访问http://localhost:8080/web04/abc/aabbcc,OK
访问http://localhost:8080/web04/abc/aa/aabbcc,OK
访问http://localhost:8080/web04/abc/aabbcc,OK
访问http://localhost:8080/web04/abc/aa/aabbcc,OK
10. Servlet处理多种请求
一个servlet如何处理多种请求?
step1 使用后缀匹配模式。
step2 在service()方法里加入如下代码
//获得请求资源路径
String uri = request.getRequestURI();
//分析请求资源路径,来决定做何种处理。
servlet生命周期及核心接口不类
10.1. 核心接口与类
1) Servlet接口
init(ServletConfig config)
destroy()
service(ServletRequest res,ServletResponse rep)
2) GenericServlet抽象类
实现了Servlet接口中的init、destroy方法。
3) HttpServlet抽象类
继承了GenericServlet,实现了service方法。
4) ServletRequest与ServletResponse接口
5) HttpServletRequest与HttpServletRequest接口
6) ServletConfig接口
String getInitParameter(String paraName);
一个servlet如何处理多种请求?
step1 使用后缀匹配模式。
step2 在service()方法里加入如下代码
//获得请求资源路径
String uri = request.getRequestURI();
//分析请求资源路径,来决定做何种处理。
servlet生命周期及核心接口不类
10.1. 核心接口与类
1) Servlet接口
init(ServletConfig config)
destroy()
service(ServletRequest res,ServletResponse rep)
2) GenericServlet抽象类
实现了Servlet接口中的init、destroy方法。
3) HttpServlet抽象类
继承了GenericServlet,实现了service方法。
4) ServletRequest与ServletResponse接口
5) HttpServletRequest与HttpServletRequest接口
6) ServletConfig接口
String getInitParameter(String paraName);
11. servlet 的生命周期
所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程。
阶段一: 实例化(就是创建servlet对象,调用构造器)
在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有
load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
阶段二:初始化
为servlet分配资源,调用init(ServletConfig config);方法
config对象可以用来访问servlet的初始化参数。
初始化参数是使用init-param配置的参数。
init可以override。
阶段三:就绪/调用
有请求到达容器,容器调用servlet对象的service()方法。
HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法。
但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
阶段四:销毁
容器依据自身的算法,将不再需要的servlet对象删除掉。
在删除之前,会调用servlet对象的destroy()方法。
destroy()方法用于释放资源。
在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程。
阶段一: 实例化(就是创建servlet对象,调用构造器)
在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有
load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
阶段二:初始化
为servlet分配资源,调用init(ServletConfig config);方法
config对象可以用来访问servlet的初始化参数。
初始化参数是使用init-param配置的参数。
init可以override。
阶段三:就绪/调用
有请求到达容器,容器调用servlet对象的service()方法。
HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法。
但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
阶段四:销毁
容器依据自身的算法,将不再需要的servlet对象删除掉。
在删除之前,会调用servlet对象的destroy()方法。
destroy()方法用于释放资源。
在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
12. jsp文件的组成
a. html(包括css、javascript)
直接写在.jsp文件里即可
b. java代码
第一种形式:java代码片断
语法: <% java代码 %>
第二种形式:jsp表达式
诧法: <%= java表达式%>
c. 指令
所谓指令,就是告诉jsp引擎(容器当中,负责将.jsp文件转换成.java文件,并在运
行时,为jsp提供一些辅助支持的模块),在将.jsp文件转换成.java文件时,做一些额外的处理。
语法: <%@ 指令名 属性名=属性值%>
page指令
##常用指令共3个,今天了解并掌握page指令##
import属性:
用于导包。
比如<%@page import="java.util.*,java.text.*"%>
contentType属性:
等价于response.setContentType();
pageEncoding属性:
告诉jsp引擎,.jsp文件保存时的编码。
d. 隐含对象
所谓隐含对象,指的是在.jsp文件当中,不用声明和创建该对象,就可以直接使用的对象。
原因是,.jsp文件对应的.java文件当中,已经自动生成了该对象的代码。
out
request
response
4) jsp文件如何转换成.java文件 *
html转换为 jsp
放到service()方法里,使用out.write()输出。
java代码片断
放到service()方法里,照搬
a. html(包括css、javascript)
直接写在.jsp文件里即可
b. java代码
第一种形式:java代码片断
语法: <% java代码 %>
第二种形式:jsp表达式
诧法: <%= java表达式%>
c. 指令
所谓指令,就是告诉jsp引擎(容器当中,负责将.jsp文件转换成.java文件,并在运
行时,为jsp提供一些辅助支持的模块),在将.jsp文件转换成.java文件时,做一些额外的处理。
语法: <%@ 指令名 属性名=属性值%>
page指令
##常用指令共3个,今天了解并掌握page指令##
import属性:
用于导包。
比如<%@page import="java.util.*,java.text.*"%>
contentType属性:
等价于response.setContentType();
pageEncoding属性:
告诉jsp引擎,.jsp文件保存时的编码。
d. 隐含对象
所谓隐含对象,指的是在.jsp文件当中,不用声明和创建该对象,就可以直接使用的对象。
原因是,.jsp文件对应的.java文件当中,已经自动生成了该对象的代码。
out
request
response
4) jsp文件如何转换成.java文件 *
html转换为 jsp
放到service()方法里,使用out.write()输出。
java代码片断
放到service()方法里,照搬
13.重定向
a. 用户在浏览器提交form表单,通过add到服务器找到AddEmp
b. AddEmp向数据库中插入一条数据
c. AddEmp返回给用户一个消息头location= list(ListEmp的地址)和302状态码
当浏览器碰到状态码302后,浏览器会自动向新地址发请求
d. 浏览器自动通过list找到ListEmp
e. ListEmp到数据库中查询数据并返回给浏览器
b. AddEmp向数据库中插入一条数据
c. AddEmp返回给用户一个消息头location= list(ListEmp的地址)和302状态码
当浏览器碰到状态码302后,浏览器会自动向新地址发请求
d. 浏览器自动通过list找到ListEmp
e. ListEmp到数据库中查询数据并返回给浏览器
1) 什么是重定向?
服务器向浏览器发送一个状态码302及一个消息头location,浏览器收到后,会立即向
location所指向的地址发送请求。
2) 如何重定向
response.sendRedirect(String url); 其中,url是重定向的地址。
3) 编程要注意的问题
重定向之前,不能够有out.close()或者out.flush()操作。
重定向之前,如果response对象缓存有数据,则这些数据会被清空。
4) 重定向的特点
重定向的地址是任意的
重定向之后,浏览器地址栏的地址变成了location所指定的地址。
服务器向浏览器发送一个状态码302及一个消息头location,浏览器收到后,会立即向
location所指向的地址发送请求。
2) 如何重定向
response.sendRedirect(String url); 其中,url是重定向的地址。
3) 编程要注意的问题
重定向之前,不能够有out.close()或者out.flush()操作。
重定向之前,如果response对象缓存有数据,则这些数据会被清空。
4) 重定向的特点
重定向的地址是任意的
重定向之后,浏览器地址栏的地址变成了location所指定的地址。
14. 转发
1) 什么是转发?
一个web组件(jsp/servlet)将未完成的处理转交给另一个web组件继续处理。转发的各个组件会共享request和response对象。
2) 如何转发?
step1
先绑订数据
request.setAttribute(String name,Object obj);
跟绑订相关的另外两个方法
//如果name对应的值不存在,返回null。
Object request.getAttribute(String name);
request.removeAttribute(String name);
step2
获得转发器,转发
RequestDispatcher rd = request.getRequestDispatcher(String uri);
rd.forward(request,response);
1) 什么是转发?
一个web组件(jsp/servlet)将未完成的处理转交给另一个web组件继续处理。转发的各个组件会共享request和response对象。
2) 如何转发?
step1
先绑订数据
request.setAttribute(String name,Object obj);
跟绑订相关的另外两个方法
//如果name对应的值不存在,返回null。
Object request.getAttribute(String name);
request.removeAttribute(String name);
step2
获得转发器,转发
RequestDispatcher rd = request.getRequestDispatcher(String uri);
rd.forward(request,response);
转发需要注意的问题
转发之前,不能够执行out.close或者out.flush。
转发之前,会将response中缓存的数据先清空。
转发之前,不能够执行out.close或者out.flush。
转发之前,会将response中缓存的数据先清空。
15.重定向和转发的区别
1) 地址
转发的地址必须是同一个应用内部的某个组件(不能跨应用,不能跨服务器)
比如:
地址1 http://localhost:8080/web06/aaa.jsp
地址2 http://localhost:8080/web06/bbb.jsp
地址3 http://localhost:8080/web07/ccc.jsp
地址4 http://www.tarena.com.cn
在应用web06内部的组件aaa.jsp 可以将信息转发到地址2(同一应用),但是不可以
转发到地址3(跨应用)和地址4(跨服务器)
重定向的地址没有限制
2) 能否共享request
转发可以
重定向不行
原因是转发是一次请求,重定向为两次请求,Request的生命周期只能在一次请求内,
请求结束,Request 被删除
3) 浏览器地址栏的地址是否变化
转发不变
重定向会变
4) 事件是否处理完毕
转发是一件事未做完
重定向是一件事已经做完
转发的地址必须是同一个应用内部的某个组件(不能跨应用,不能跨服务器)
比如:
地址1 http://localhost:8080/web06/aaa.jsp
地址2 http://localhost:8080/web06/bbb.jsp
地址3 http://localhost:8080/web07/ccc.jsp
地址4 http://www.tarena.com.cn
在应用web06内部的组件aaa.jsp 可以将信息转发到地址2(同一应用),但是不可以
转发到地址3(跨应用)和地址4(跨服务器)
重定向的地址没有限制
2) 能否共享request
转发可以
重定向不行
原因是转发是一次请求,重定向为两次请求,Request的生命周期只能在一次请求内,
请求结束,Request 被删除
3) 浏览器地址栏的地址是否变化
转发不变
重定向会变
4) 事件是否处理完毕
转发是一件事未做完
重定向是一件事已经做完
什么时候用重定向?
比如用户做删除操作时,删除操作已做完,重定向访问list.do
比如用户做删除操作时,删除操作已做完,重定向访问list.do
比如(1)用户调用list.do,(2)由 ListServlet到数据库中查询数据,(3)ListServlet将查询到
的数据通过Servlet引擎转发给负责显示的empList.jsp,(4)empList.jsp 将数据通过友好的界
面显示给用户
16.表单中文处理步骤
step1
jsp文件,要添加
<%@page pageEncoding="utf-8"
contentType="text/html;charset=utf-8"%>
表单设置method="post"。
step2
在servlet类当中,添加request.setCharacterEncoding("utf-8");
step3
如果要访问数据库:
a. 保证数据库能够正常地保存中文。
对于mysql数据库
create database dbname default character set utf8;
b. 使用jdbc访问数据库时,必须要保证jdbc驱动程序能够识别数据库中保存数据的编码。
jdbc:mysql://localhost:3306/jd1109db2?
useUnicode=true&characterEncoding=utf8
step1
jsp文件,要添加
<%@page pageEncoding="utf-8"
contentType="text/html;charset=utf-8"%>
表单设置method="post"。
step2
在servlet类当中,添加request.setCharacterEncoding("utf-8");
step3
如果要访问数据库:
a. 保证数据库能够正常地保存中文。
对于mysql数据库
create database dbname default character set utf8;
b. 使用jdbc访问数据库时,必须要保证jdbc驱动程序能够识别数据库中保存数据的编码。
jdbc:mysql://localhost:3306/jd1109db2?
useUnicode=true&characterEncoding=utf8
17. 路径问题
1) 链接地址、表单提交、重定向、转发的路径应该如何写?
a. 链接地址: <a href=""></a>
b. 表单提交: <form action="">
c. 重定向: response.sendRedirect("");
d. 转发: getRequestDispatcher("");
2) 相对路径与绝对路径
相对路径:
不以"/"开头的路径,比如:<a href="del.do"></a>
在当前路径下进行跳转
绝对路径:
以"/"开头的路径,比如:<a href="/appname/del.do"></a>
建议:因为相对路径较易出错,建议在实际开发中尽量使用绝对路径
3) 怎样写绝对路径?
链接、表单提交、重定向,绝对路径要从应用名开始写。
转发要从应用名之后开始写。
1) 链接地址、表单提交、重定向、转发的路径应该如何写?
a. 链接地址: <a href=""></a>
b. 表单提交: <form action="">
c. 重定向: response.sendRedirect("");
d. 转发: getRequestDispatcher("");
2) 相对路径与绝对路径
相对路径:
不以"/"开头的路径,比如:<a href="del.do"></a>
在当前路径下进行跳转
绝对路径:
以"/"开头的路径,比如:<a href="/appname/del.do"></a>
建议:因为相对路径较易出错,建议在实际开发中尽量使用绝对路径
3) 怎样写绝对路径?
链接、表单提交、重定向,绝对路径要从应用名开始写。
转发要从应用名之后开始写。
18.<servlet-name>,<servlet-class>,<servlet-mapping>,<url-pattern>,这些各表示:
<servlet-name> 这个是我们要注册servlet的名字,一般跟Servlet类名有关
<servlet-class> 这个就是指向我们要注册的servlet 的类地址, 要带包路径
以上两个包在一个servlet节点之下
如:
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.breeze.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping> 是用来配置我们注册的组件的访问路径,里面包括两个节点
一个是 <servlet-name> 这个要与前面写的servlet一样
另一个是 <url-pattern> 配置这个组件的访问路径
如:
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name> 与上面的 <servlet-name> 要一致
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
<servlet-name> 这个是我们要注册servlet的名字,一般跟Servlet类名有关
<servlet-class> 这个就是指向我们要注册的servlet 的类地址, 要带包路径
以上两个包在一个servlet节点之下
如:
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.breeze.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping> 是用来配置我们注册的组件的访问路径,里面包括两个节点
一个是 <servlet-name> 这个要与前面写的servlet一样
另一个是 <url-pattern> 配置这个组件的访问路径
如:
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name> 与上面的 <servlet-name> 要一致
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>