使用servlet做一个最简单的微型网站demo,不建议任何人观看
写下这篇博客主要还是为了梳理一下前期学习基础不牢固的相关知识,给自己做个回顾。
java语言 首先网站部署在tomcat上,使用maven进行了配置。
一个网站主要包括几个部分,前端登录界面,后端使用servlet和相关文件进行请求处理和回复,后续业务逻辑所处理数据库中的信息进行连接并返回到其他前端界面。目前学习过程中最重要的是几个servlet类的使用方法。
前端使用表单进行登录及相关数据提交,在这里主要是为了演示网站相关功能,并没有实际作用,只起到传递请求和参数的作用。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册界面</title>
</head>
<body>
<form action="ret" method="post">//这一行是比较重要的,action决定了所使用servlet的位置或者说urlpattern,稍后会提到,method则是指出所使用的传递方式。
<p>
账号:<input type="text" name="username" />//input是输入框
</p>
<p>
密码:<input type="password" name="pwd" />
</p>
<p>
性别: <input type="radio" name="sex" value=1 />男 <input type="radio"
name="sex" value=0 />女
</p>
<p>
兴趣: <input type="checkbox" name="interest" value="sports" />运动 <input //checkbox是多选框
type="checkbox" name="interest" value=read />阅读 <input
type="checkbox" name="interest" value=movie />电影
</p>
<p>
注册:<input type="submit" value="注册" >
</p>
</form>
</body>
</html>
form action=“ret” method="post"这一行是比较重要的,action决定了所使用servlet的位置或者说urlpattern,稍后会提到。而method则是指出所使用的传递方式,表单通常是使用post传递。这是有get和post两个方法的特性决定的。
get | post |
---|---|
采用请求路径进行传参 | 采用实体进行传参 |
参数传递是可见的,不安全 | 参数传递不可见,安全性好,但可用f12中network看到信息 |
地址长度有限,2k以内 | 大小无限制 |
默认请求使用get | 需注明 |
另外在这里选择get或post会影响到浏览器访问的servlet接收信息所使用的方法,相应的影响到了所需重写的方法。使用post传递,接收就是doPost,使用get传递,接收就是doGet。
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.html.HTML;
public class reg extends HttpServlet {
/**
* @author hhf
* @see name@ this class is design to help a man who need the way to his wanted.
*/
@Override
public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {
//处理请求的一般步骤是:1.接受参数2.处理业务3.发送响应
// 接受参数其中parameter是单个值,而getparametervalues是多个值。
req.setCharacterEncoding("utf-8");//设置接收值的解码类型
String username = req.getParameter("username");//接收相关参数
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String[] interest = req.getParameterValues("interest");
Cookie nameCookie = new Cookie("name", username);//使用cookie进行数据信息传递
res.addCookie(nameCookie);//将创建的cookie返回到浏览器端
System.out.print(username + ":das");
if (interest != null) {
for (String i : interest) {
System.out.print(i);
}
}
// res.setCharacterEncoding("utf-8");//进行输出的相关方法如下
// res.setContentType("text/html");//必须是这样的格式,不能任何变化
// PrintWriter outPrintWriter = res.getWriter();
// outPrintWriter.printf(username+" <p>你好,世界</p>");
// outPrintWriter.close();
res.sendRedirect("res");// 重定向跳转到指定的网页或者其他servlet等文件
}
}
在上面的html代码中可以看到没有使用绝对路径或者相对路径,而是使用ret就可以访问下面的servlet,这是使用了部署描述符实现的。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>regs</servlet-name><!-- 要定义新的完整的类名 反射-->
<servlet-class>web.reg</servlet-class><!-- 要指定该类名所指向的文件 反射-->
</servlet>
<servlet-mapping>
<servlet-name>regs</servlet-name><!-- 保持与上述名称不变-->
<url-pattern>/ret</url-pattern><!-- 设定路径名为ret,所以当在本项目中访问ret就是访问到这里-->
</servlet-mapping>
<servlet>
<description></description>
<display-name>res</display-name>
<servlet-name>res</servlet-name>
<servlet-class>web.res</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>res</servlet-name>
<url-pattern>/res</url-pattern>
</servlet-mapping>
</web-app>
其实根本不用这么麻烦,直接在servlet文件开头使用注解@WebServlet(name = “ShoppingCartServlet”, urlPatterns = { “/products”, “/viewProductDetails”, “/addToCart”, “/viewCart” })即可指定索要访问的文件路径名。
但是由于http是一个无连接协议,就引入了一个重要的命题,如何保存用户状态,因为一个用户登录后就应当以当前身份访问所有用户,因此引入了状态保存,或者说是会话管理。其中主要使用了大名鼎鼎的cookie和session,cookie是保存于用户端的,而session是保存于服务器内存及交换文件中的。