学习java的第二十一天
- 基本概念
- C/S架构。
- B/S架构。
- tomcat的安装和目录介绍
- tomcat的启动命令:
- 开发一个简单的服务器项目,在tomcat中运行:
- Eclipse中配置tomcat
- 开发一个简单的servlet程序
- servlet的生命周期
- 简单示例,演示登录效果:创建index.html
- 创建LoginServlet.java
- 页面跳转
- Get和Post方法区别
- 使用之前的数据库代码完成注册功能 reg.html
- RegServlet.java
基本概念
Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果。
C/S架构。
Client和Server即客户端和服务器。
优点:一般来说由于客户端已经安装,所以不需要每次都加载页面元素,运行过程中只需要传输数据。并且客户端能够显示的动画效果更好,更完整。
缺点:必须要下载安装客户端,如果没有安装就不能运行,而一般的程序客户端都比较大,需要时间下载。对于系统的支持不能保证。
B/S架构。
Browser/Server即浏览器和服务器。
优点:无需下载客户端,也不用关心是什么系统,只有有浏览器的系统都可以使用。
缺点:能够操作的习惯必须遵循浏览器的习惯。动画等效果可能没有客户端那么流畅。
tomcat的安装和目录介绍
bin:tomcat软件中的一些可执行文件
conf:配置文件
lib:tomcat在运行过程中所需要的一些第三方库(jar包)。
logs:tomcat的日志文件
temp:临时文件
webapps:运行在tomcat中由程序员开发的一些项目
work:tomcat中执行一些JSP页面文件需要翻译和转译的一些临时文件
tomcat的启动命令:
在dos窗口切换到tomcat的bin目录,
1.输入catalina.bat run
作用是将tomcat以控制台的模式启动,会将所有的服务器运行过程中的System.out.print输出的信息输出到控制台,并且控制台不能关闭,一旦关闭,tomcat停止运行。
2.输入startup.bat
作用是启动tomcat,会另外开启一个控制台,当前命令行可以关闭。在其他系统(例如:Linux)中,不会开启一个新的控制台,只会在后台以服务的形式启动tomcat。
开发一个简单的服务器项目,在tomcat中运行:
1打开webapps,新建一个文件夹,起名为test(工程名)
2开发一个简单的html文件,放入到test文件夹中,命名为index.html,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h1>千锋欢迎你</h1>
</body>
</html>
3使用浏览器访问地址:http://ip地址(本机可以使用localhost):端口号/test,其他人也可以访问
4将静态页面改成动态页面,修改代码:
<%@page pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<%! int i = 1;%>
<h1>千锋欢迎你,你是第<%= i++%>个访问页面的用户</h1>
</body>
</html>
将页面的html后缀名改成jsp。再次访问原来的第三步的地址,可以看到会随着用户的刷新而数量变化。这是我们开发的第一个动态页面效果。
Eclipse中配置tomcat
步骤:
1. 在新建工程的地方右键选择新建->other,选择server
2. 选择Apache,选择tomcat8.0
3. 点击Browse按钮选择tomcat8.0的安装路径
4. 点击Finish
5. 打开server控制台,双击server的配置
6. 将tomcat工程路径配置到webapps中
开发一个简单的servlet程序
1新建一个web工程,选择server用tomcat8.0
2新建一个类HelloServlet,继承HttpServlet,重写doGet和doPost方法。
public class HelloServlet extends HttpServlet{
// 处理页面表单的get请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print("<h1>Hello, world</h1>");
}
// 处理页面表单的post请求
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3配置HelloServlet的访问路径
<!-- 可以使用两种方式配置,一种是在web.xml中配置,在任意版本都可以使用-->
<!-- servlet的名称 -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.qianfeng.day21.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet的映射路径,一定以/开头 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.do</url-pattern>
</servlet-mapping>
<!-- 另一种是在HelloServlet中直接配置,但是两种配置方案只能使用一种-->
@WebServlet("/hello1.do") // 一定要以/开头,只能在web.xml中version=3.0或以上的版本才能使用
public class HelloServlet extends HttpServlet{
//...省略中间的代码
}
4运行程序,在浏览器中输入所对应的路径
注意:
1. 路径中一定会包含工程名称。
2. 在重写doGet和doPost方法时,一定要删除通过super.去调用父类方法的代码。因为父类对应的方法中会直接抛出异常,提醒用户必须重写该方法。
3. 不要在方法中自己调用自己,容易构成死循环。
4. 可以配置多层路径,但是容易出现问题。建议现阶段路径就配置一层。
servlet的生命周期
生命周期是指对象从出生到消亡的过程。
创建:对象的创建,会调用构造方法。只是在第一次被访问的时候创建对象,后面都不会再创建,所以只会创建一个servlet对象。相当于单例。
初始化:对象创建完毕后,可能需要进行初始化的一些设置,初始化的方法为init。只是在第一次被访问的时候,在创建对象后紧接着进行初始化,只会执行一次。
服务:这是一个关键的周期,整个servlet的作用都在此体现,一般包含doGet和doPost两个方法。
销毁:destroy方法,作用是在servlet对象在销毁之前去关闭一些资源等。并不是使用此方法进行销毁当前对象。
@WebServlet("/hello.do") // 一定要以/开头
public class HelloServlet extends HttpServlet{
// 初始化方法
@Override
public void init() throws ServletException {
System.out.println("对象正在被初始化...");
}
// 构造方法
public HelloServlet() {
System.out.println("HelloServlet正在被创建");
}
// 处理页面表单的get请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("提供服务...");
response.getWriter().print("<h1>Hello, world</h1>");
}
// 处理页面表单的post请求
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
// 在对象销毁前关闭资源的方法
@Override
public void destroy() {
System.out.println("HelloServlet将要被销毁,正在关闭资源...");
}
简单示例,演示登录效果:创建index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="login.do" method="get">
<input type="text" name="username" placeholder="用户名"/><br/>
<input type="password" name="pwd" placeholder="密码"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
创建LoginServlet.java
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// request指请求对象
// response指相应对象
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 接收请求参数
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
// 得到响应输出页面对象
// 设置页面显示中文
// response.setCharacterEncoding("utf-8"); // 有时不起作用,不建议使用
// 或者
response.setContentType("text/html;charset=utf-8"); // 建议使用
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.print("<html>");
out.println("<head>");
out.println("<meta charset=\"utf-8\" />");
out.println("<title></title>");
out.println("</head>");
out.println("<body>");
if(username.equals("zhangsan") && pwd.equals("123456")) {
out.println("登录成功!");
}else {
out.println("登录失败!");
}
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
页面跳转
每次都使用out.print()去输出复杂的html不方便,可以直接使用页面跳转的方式去跳转到新的页面。
页面跳转有两种方式:
第一种叫做重定向,相当于a链接,代码如下:
response.sendRedirect("success.html");
第二种叫做请求转发,代码如下:
request.getRequestDispatcher("success.html").forward(request, response);
两种方式的区别:
1. 请求转发页面地址不会改变,而重定向会改变地址。会影响页面上静态资源(图片,css,js,a等)路径。
2. 请求转发会传递请求参数,而重定向丢失所有请求和响应中的数据。
Get和Post方法区别
1. get提交到doGet方法处理,post提交给doPost处理。
2. get会将参数显示在地址栏,而post不会显示。
3. get相对不安全,post相对安全。
4. get传递的参数长度会有限制,post会长很多,基本没有太多的限制。
5. get不适用于文件上传,post适用于文件上传。
6. get适用于搜索引擎搜索,邮件发送信息,内容分享等,而post不适用
可以简单理解为,除了第6条需要使用get,其他可以都用post。读一般可以使用get,写一般使用post
// get转码方式
name = new String(name.getBytes("ISO8859-1"), "utf-8");
// post能够一次全部转码
request.setCharacterEncoding("utf-8");// 此代码一定要写在request.getParameter("")之前。
使用之前的数据库代码完成注册功能 reg.html
<body>
<form action="reg.do" method="post">
<input type="text" name="name" placeholder="姓名"/><br/>
性别:<input type="radio" name="sex" value="0"/>男
<input type="radio" name="sex" value="1"/>女<br/>
年龄:<select name="age">
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
</select><br/>
<input type="text" name="address" placeholder="地址"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
RegServlet.java
@WebServlet("/reg.do")
public class RegServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 页面提交数据之所以编码有问题,是因为tomcat默认页面表单提交参数使用的是ISO8859-1编码(ASCII)
// 如果是post,可以直接一次将所有的字符集都转换
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
// 将字符串解析成字节数组,然后根据utf-8组成规则变成utf-8字符,但是这种方式需要一个一个的转,比较麻烦,适用于get表单
// name = new String(name.getBytes("ISO8859-1"), "utf-8");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
int nage = 0;
try {
nage = Integer.parseInt(age);
}catch(Exception e) {
nage = 18;
}
String address = request.getParameter("address");
Student stu = new Student(0, name, sex, nage, address);
if(StudentDAO.insert(stu)) {
response.sendRedirect("html/success.html");
}else {
response.sendRedirect("html/fail.html");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}