Servlet是什么
看着各种参考书上官方对于一些东西地定义就头疼。
简单的说servlet就是跑在web服务器中的小Java程序,是Java中的类,用来接受和相应网页传过来的东西,主要是http。
Servlet可提供一下功能:
(1)对客户端发送的数据进行读取和拦截。
(2)读取客户端请求的隐含数据。
(3)运行结果或生成结果。
(4)发送响应数据。
servlet编写与部署
编写servlet类
编写servlet的方法有继承和接口,这里主要用继承示范
首先在src文件里面创建包
编写servlet类
package com.HelloServlet;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
private String message;
@Override
public void init() throws ServletException {
System.out.println("调用initial方法");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用doGet方法");
// 设置响应内容类型
resp.setContentType("text/html");
// 实际的逻辑是在这里
PrintWriter out = resp.getWriter();
out.println("<h1> test </h1>");
}
@Override
public void destroy() {
System.out.println("调用destroy");
}
}
编写好类之后,必须在web.xml中注册(即部署)才能生效
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注册servlet
使用标签:<servlet>
<servlet-name>:注册的名字
<servlet-class>:类的位置
-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.HelloServlet.HelloServlet</servlet-class>
</servlet>
<!--servlet映射
<servlet-name>:确定要访问哪一个
<url-pattern>:设置浏览器访问路径
url必须/开头,且必须唯一
-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
此时我们就可以通过http://localhost:8080/项目名/设置的访问路径 来访问了。
servlet的生命周期
servlet的生命周期其实可以简单的理解为从创建到毁灭的这个过程就叫做生命周期。servlet的生命周期分为三个阶段:1.初始化阶段,调用init()方法。相当于servlet创建。2.响应客户请求阶段,调用service()方法 。3.终止阶段,调用destory()方法。即servlet的毁灭。
上面的代码中也相应有init()方法和destory()方法。
servlet get 和post,doGet和doPost方法的使用
get是从服务器上获取数据,post是向服务器传送数据。
get方法主要通过地址传输参数,对于参数大小也有限制,对于账户密码等重要数据就不能通过get方法传输。Servlet 使用 doGet() 方法处理这种类型的请求。
而对于post方法传值的话,能保证信息的安全性,不会通过地址栏传输,主要是form表单中传值运用。Servlet 使用 doPost() 方法处理这种类型的请求。
get,doGet,post,doPost代码实现
get 方法
编写HTML前端页面文件
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="gb2312" %>
<html>
<head>
<title>get&post测试</title>
</head>
<body>
<form action="helloServlet" method="get">
<p>网络技术工作室</p>
账户:<input type="text" name="name">
<br />
密码:<input type="text" name="password" />
<input type="submit" value="提交" />
</form>
</body>
</html>
编写接受页面helloServlet,一定要在web.xml注册
package com.HelloServlet;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
/*
* @Override
* public void init() throws ServletException {
* //System.out.println("调用initial方法");
* }
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=gbk");
PrintWriter out = resp.getWriter();
/*
*getParameter("name"):获取页面传来的值
* getBytes("ISO8859-1"):解决中文乱码问题
*/
String name =new String(req.getParameter("name").getBytes("UTF-8"),"UTF-8");
String password = new String(req.getParameter("password").getBytes(),"UTF-8");
String webType = "<!DOCTYPE html> \n";
//打印网页HTML代码进行编译
out.println(webType +
"<html>\n" +
"<head><title>" + "doGet doPost测试"+ "</title></head>\n" +
"<body>\n" +
" <b>账户</b>:"
+ name + "\n" +
" <b>密码</b>:"
+ password + "\n" +
"</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);//直接引用doGet方法,方法一致,接受不一样
}
}
结果
(注意地址栏红框传参数)
post方法
只需要在前端页面更改<form action="helloServlet" method="post">
HttpServletRequest方法
获取客户机信息
String requestUrl = request.getRequestURL().toString();//得到请求的URL地址 String requestUri = request.getRequestURI();//得到请求的资源 String queryString = request.getQueryString();//得到请求的URL地址中附带的参数 String remoteAddr = request.getRemoteAddr();//得到来访者的IP地址 String remoteHost = request.getRemoteHost();//获取客户主机名 int remotePort = request.getRemotePort();//获取客户主机端口号 String remoteUser = request.getRemoteUser();获取当前缓存的用户 String method = request.getMethod();//得到请求URL地址时使用的方法 String pathInfo = request.getPathInfo();//请求的serlvet的url的路径 String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址 String localName = request.getLocalName();//获取WEB服务器的主机名 response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器 //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
获得客户机请求头(简单了解)
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法
获得客户机请求参数(客户端提交的数据)
- getParameter(String)方法(常用)
- getParameterValues(String name)方法(常用)
- getParameterNames()方法(不常用)
- getParameterMap()方法(编写框架时常用)
在上面的代码中就有使用getParameter(String)方法,功能和php中的$_GET $_POST类似,获取前端传输的数据。可自习看一下上面代码的使用。
getParameterValues(String name)方法,个人理解多用于获取复选框的多个数据且以数组形式存储,例如一个表单中的多选。
后面两种有兴趣可以自己查阅。
HttpServletResponse方法
HttpServletResponse主要是
常用方法
addHeader(String name,String value) 将指定的名字和值加入到响应的头信息中。
encodeURL(String url) 编码指定的URL。
sendError(int sc) 使用指定状态码发送一个错误到客户端。
setDateHeader(String name,long date 将给出的名字和日期设置响应的头部。
setHeader(String name,String value) 将给出的名字和值设置响应的头部。
setStatus(int sc) 给当前响应设置状态码。
HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
response.setContentType("text/html;charset=utf-8");
setContentType(String ContentType) 设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。输出流的 HTTP
MIME 类型。默认值为“text/html”。
MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
使用输出流输出一张图片的时候,比如做验证码图片的时候 如果在Firefox中直接浏览验证码是乱码,放在里面则不会
这时候就要事先指定Response.ContentType = "image/jpeg";//设定MIME类型
response.setHeader(“Refresh”,”2;url=”http://www.baidu.com”); 页面的刷新
消息实体内容 通过输出流对象进行设置,用以下两个方法:
Response.getOutputStream() 字节输出流对象
Response.getWriter() 字符的输出流对象
注:out.close();系统会自己释放,但一般写上
部分代码实现:
// 设置刷新自动加载时间为 5 秒 response.setIntHeader("Refresh", 5); // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); //使用默认时区和语言环境获得一个日历 Calendar cale = Calendar.getInstance(); //将Calendar类型转换成Date类型 Date tasktime=cale.getTime(); //设置日期输出的格式 SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
JDBC访问数据库
MySQL数据库基础自行了解。
JDBC是一种Java连接数据库技术, 它是 Java 提供的一些接口,这些接口大部分是数据库厂商提供的(jar包),我们要做的,是连接数据库以后,如何使用Java代码从数据库中存取数据!
和数据库建立连接
连接数据库必要的参数:
URL: 访问数据库的地址:写法:
jdbc:mysql://数据库所在Ip地址:数据库端口/数据库的名字
name : 要连接的数据库的账户名
password : 要连接数据库的用户密码
//3306是数据库的默认端口
String url = "jdbc:mysql://localhost:3306/student";
String name = "root";//将要连接数据库的账户
String password = "root";//将要连接数据库的密码
Connection connection = DriverManager.getConnection(url,name,password);
用于执行SQL语句
PreparedStatement接口继承了Statement,
Statement(固定),和 PreparedStatement(可变参数) 是SQL语句的两种执行方式
1.在遇到要执行的SQL语句是带可变参数的时候,就用PreparedStatement对象,应为PreparedStatement可以用占位符将SQL语句加入可变参数!
String sql = "insert into user(sno,name,age)values("12345","liu",12)";//定义一个要执行的SQL语句
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,student.getSno());//设置SQL语句的第一个参数
ps.setString(2,student.getName());//设置SQL语句的第二个参数
ps.setInt(3,student.getAge());//设置SQL语句的第三个参数
2.当要执行的SQL语句的是不带可变参数的时(就是SQL语句不变时!):
String sql = "SELECT * FROM user";
Statement statement = connection.createStatement();//sql语句的执行对象
ResultSet row = statement.executeQuery(sql);//执行SQL语句
PreparedStatement 和Statement的区别:
PreparedStatement:用户通过你系统输入变量时,变量将加入你的SQL语句,这样就能在不知道你的用户输入的情况下,获取信息
两种语句:
1).不用返回数据库信息:
增,删,改
exexuteUpdate() 方法 : 返回一个整形(对数据库影响的行数)
2).需要返回数据库信息:
查
exexuteQuery() 方法 : 返回一个结果集对象(Resultest 在数据库中查到的一条数据)
读取返回对象集中的数据的方法: (就是集合的迭代器)
Resultest.next()能够返回给你还有没有记录,
getObjeck方法,读取一条记录里面字段所对应的值
调用Dao的方法后返回一个结果给servlet 让servlet进行处理!:如:
int row = UserDAD.insert(student);
if (row==1){
jsonObject.put("code",1);
jsonObject.put("msg","添加成功");
jsonObject.put("data",student);
}else {
jsonObject.put("code",2);
jsonObject.put("msg","添加失败");
}
释放资源
将用到的传输有关的对象再传输完成后统统释放! 如:
ps.close();
connection.close()
代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DbUtil {
public static final String URL = "jdbc:mysql://localhost:3306/imooc";
public static final String USER = "liulx";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
//加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//操作数据库,实现增删改查
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");
//如果有数据,rs.next()返回true
while(rs.next()){
System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
}
}
}