使用Eclipse结合Tomcat开发一个简单的Servlet和JSP
- 首先需要配置Tomcat,使得能够正常启动Tomcat安装完毕需要将jre换成jdk需要配置好如下三个环境变量:JAVA_HOME
CATALINA_HOME
PATH - Servlet是JAVA服务器端编程,不同于我们之前写的一般的JAVA应用程序,Servlet程序是运行在服务器上的,服务器有很多种,此次用到的服务器就是Tomcat
- 常用的服务器:Tomcat、Resin、Jetty、Weblogic、WebSphere、JBoss
- 在 Tomcat 安装目录的 conf 目录下打开 server.xml 文件,找到倒数第四行,在上面加入如下 XML 片段:
- 启动 Tomcat(startup.bat),打开浏览器,访问如下地址:http://localhost:8080/test/login.jsp
- web.xml(deployment descriptor),部署描述符
- 我们可以将 Servlet 看作是嵌套了 HTML 代码的 Java 类;可以将 JSP看作是嵌套了 Java 代码的 HTML 页面。
- jsp被编译后会生成servlet,拿eclipse来说,编译后的路径:
工程.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\JspProject\org\apache\jsp - get 与 post 方法之间的差别:
1) 浏览器地址栏呈现的结果不同(表象)
2) 真正的原因在于向服务器端发送请求时的形式是不同的
用GET方法请求,底层实现是:
GET /JavaWeb/LoginServlet?username=12345&password=12345 HTTP/1.1
对于POST来说:
POST /JavaWeb/LoginServlet HTTP/1.1
Connection:Keep-Alive(回车)
(回车)
username=12345&password=12345
我们可以看出POST方法并不是把信息附加在URL上面而是作为请求体的一部分一起发送过去的 - 通过浏览器进行文件上传时,一定要使用 post 方式而绝不能使用get 方式。
- 通过浏览器地址栏输入网址的方式来访问服务器端资源,全部使用的是 get 方法请求
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet" method="post">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="submit">
<input type="reset" value="reset">
</form>
</body>
</html>
servlet
package learn.servlet;
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 LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet invoked");
process(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost invoked");
process(req, resp);
}
private void process(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println(req);
System.out.println(resp);
String username = req.getParameter("username");
String password = req.getParameter("password");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Login Result</title></head>");
out.println("<body> username: " + username + "</br>");
out.println("password: " + password + "</body></html>");
out.flush();
}
}
web.xml
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>learn.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
当jsp页面用get方法请求时输出:
doGet invoked
org.apache.catalina.connector.RequestFacade@5f6f951c
org.apache.catalina.connector.ResponseFacade@bc2e865
当jsp页面用post方法请求时输出:
doPost invoked
org.apache.catalina.connector.RequestFacade@5f6f951c
org.apache.catalina.connector.ResponseFacade@bc2e865
使用Servlet生成静态页面
客户端、服务器与 Servlet/JSP 之间的关系
简单双色球实现
package learn.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DoubleColorBailServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Set<Integer> set = new HashSet<Integer>();
Random random = new Random();
while (set.size() !=6) {
int randomValue = random.nextInt(33) + 1;
set.add(randomValue);
}
int randomValue = random.nextInt(16) + 1;
String result = "red ball: ";
for(Integer integer : set){
result += integer + " ";
}
result += "<br>blue ball:" + randomValue;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>result</title></head>");
out.println("<body><h1>" + result + "</h1></body></html>");
out.flush();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
结果是: