1.Servlet实例编写
(1)编写Servlet代码,一般继承HttpServlet类,重写doGet、doPost
(2)在web.xml中配置Servlet,可以配置url映射关系以及初始化参数
(3)在浏览器中访问或者表单提交
(4)通过Http请求类型自动调用对应的doGet或者doPost等方法
/**
* 创建日期:2021/12/20
* 作者:高靖博
* 公司:华为(昆明)数字经济学院
*/
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
// GET
System.out.println(method);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("登录操作");
//初始化配置参数中取出参数值
ServletConfig servletConfig = this.getServletConfig();
//从配置文件中取出用户名和密码
String s_userName = servletConfig.getInitParameter("userName");
String s_pwd = servletConfig.getInitParameter("pwd");
//从请求参数中取得用户填写的用户名和密码
String userName = req.getParameter("userName");
String pwd = req.getParameter("pwd");
System.out.println("userName:"+userName);
System.out.println("pwd:"+pwd);
//响应页面的html
String html = "";
if(!(userName.equals(s_userName)&&s_pwd.equals(pwd))){
html += "<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>登录</title>\n" +
"</head>\n" +
"<body>\n" +
"<span style='color:red'>用户名或密码错误!</span>"+
" <form action=\"login\" method=\"post\">\n" +
" <label>用户名</label>\n" +
" <input type=\"text\" name=\"userName\" /><br/>\n" +
" <label>密码</label>\n" +
" <input type=\"password\" name=\"pwd\" />\n" +
" <input type=\"submit\" value=\"登录\" />\n" +
" </form>\n" +
"</body>\n" +
"</html>";
}else{
html += "<html>";
html += "<head><title>结果</title></head>";
html += "<body><h1>登录成功!</h1></body>";
html += "</html>";
}
//返回响应 登录成功
PrintWriter writer = resp.getWriter();
writer.println(html);
writer.flush();
writer.close();
}
}
2.Servlet的缺点
(1)Servlet需要返回HTML代码,将前端和后端代码耦合
3.请求重定向和请求转发
1.请求转发 RequestDispatcher接口
RequestDispatcher对象由Servlet容器创建,用于封装一个由路径所标识的服务器资源。利用RequestDispatcher对象,可以把请求转发给其它的Servlet或JSP页面,这个接口中定义了两个方法:
(1)forward(ServletRequest request, ServletResponse response)
该方法用于将请求从一个Servlet传递给服务器上的其它Servlet、JSP或者是HTML页面。在Servlet中,可以对请求进行初步处理,然后调用这个方法,由其它的资源来生成响应。
(2) include(ServletRequest request, ServletResponse response)
该方法用于在响应中包含其它资源的内容。与forward()不同的是,利用include()方法转发的资源将产生的响应并入到原来的响应对象中,原先的Servlet还可以继续输出响应信息。
2.请求转发
三种方法:
利用ServletRequest接口中的getRequestDispatcher()方法。
利用ServletContext接口中的getNamedDispatcher()方法。
利用ServletContext接口中的getRequestDispatcher()方法。
请求转发特点:
++ 服务器端行为,服务器进行servlet的转发
++ 携带请求、响应对象交给另一个Servlet处理
++ 浏览器的地址栏不会发生变化
++ forward方法是将请求响应交给另一个Servlet处理,自己本身的内容清空
++ include方法是将另一个Servlet的请求响应包含到当前Servlet中进行响应
forward方法:
req.getRequestDispatcher("Servlet的URL地址").forward(ServletRequest对象,ServletResponse对象)
include方法
req.getRequestDispatcher("Servlet的URL地址").include(ServletRequest对象,ServletResponse对象)
请求转发中参数的传递:
如:Servlet1中设置参数,然后转发给Servlet2
req.setAttribute("kkk","123456");
Servlet2取得参数
Object kkk = req.getAttribute("kkk");
3.请求重定向
重定向的特点:
++ 重定向是客户端行为
++ 重定向不能共享请求资源
++ 重定向客户端地址栏会发生变化
写法:
//重定向是响应对象调用
resp.sendRedirect("http://www.baidu.com");
4.服务端会话 Session
作用:
++ 保存登录验证信息(验证令牌,验证码)
++ 服务端缓存
(1)设置的方法,通过请求对象获取
//获取Session
HttpSession session = req.getSession();
session.setAttribute("userIsLogin",true);//设置保存参数
session.setMaxInactiveInterval(10);//设置过期时间(单位秒)
(2) 获取session中的参数
HttpSession session = req.getSession();
Object obj = session.getAttribute("userIsLogin");
(3)获取sessionid
String id = session.getId();//获取SESSION对象的唯一标识
5.实际开发中的Servlet
(1)请求的查询数据,Servlet返回结果使用JSON
(2)请求是增、删、改,返回操作的提示,也是一个JSON
(3)请求页面跳转(请求的重定向)
1.项目中的资源文件夹设置
后端业务模块分类:
系统业务
++ controller包: Servlet代码
++ dao包: JDBC代码
++ dto包 : 数据交换实体类
++ util : 工具包(可以调用静态方法的类)
核心业务
。。。
前端模块划分
++ views: 前端页面部分
++ 业务块 ... : 针对各个业务的前端文件夹
++ static : 前端使用的静态资源文件
++ lib:前端依赖(js)
2.编写项目过程
Servlet->service->dao -> 前端
demo:
响应数据实体封装
/**
* 创建日期:2021/12/22
* 作者:高靖博
* 公司:华为(昆明)数字经济学院
*/
public class Result implements Serializable {
private String code;//成功代码
private String msg;//返回的消息(操作成功! 系统异常! 权限不足)
private Object data = new Object();//封装返回数据的对象
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
跳转到登录页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//跳转到登录页面
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String scheme = req.getScheme();
String serverName = req.getServerName();
int serverPort = req.getServerPort();
String contextPath = req.getContextPath();
String pathHead = scheme+"://"+serverName+":"+serverPort+contextPath;
System.out.println(pathHead);
this.getServletContext().setAttribute("pathHead",pathHead);
resp.sendRedirect(pathHead+"/views/sys/loginIndex.html");
}
登录Servlet
/**
* 相关的数据接口
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String userName = req.getParameter("userName");
String pwd = req.getParameter("pwd");
//忽略逻辑判断。。。调用Service类
Result res = new Result();
res.setCode("0000");
res.setMsg("登录成功!");
String s = res.toString();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.print(s);
writer.flush();
writer.close();
}
前端代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<!-- ajax jsp -->
<form action="http://localhost:8080/JavaServletDemo/login" method="post">
<label>用户名</label>
<input type="text" name="userName" /><br/>
<label>密码</label>
<input type="password" name="pwd" />
<input type="submit" value="登录" />
</form>
</body>
</html>