Java Web工程(不使用Spring框架)
一.创建一个JavaWeb工程
a.新建一个Project项目
b.变成一个web工程
如果右键没有该选项,参考博文:解决无add framework support
c.如果想把其当web运行,需要与tomcat(web服务器)联系起来
二.第一个Servlet程序
a.要完成实现一个Servlet程序,需要先导包(javax在jdk中没有)
工程点击右键->open module settings->libraries->+->Java->找到tomcat中lib路径
地址路径:D:\program files\apache-tomcat-8.5.35\lib
接下来就可以开始写程序了
1.实现Servlet接口
//此时需要implements Servlet这个接口
public class MyFirstServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}
此时我想把响应打在对应的网页上就在Service中写,就写以下逻辑
//真正处理请求的方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {//用户的请求会被封装到 ServletRequest对象中//响应结果会被封装到ServletResponse对象中//如果我想输出,直接用sout只会在控制台显示,想在用户端需要输出,需要用ServletResponse对象servletResponse.setContentType("text/html") ;//可以不写,代表我以网页的形式输出PrintWriter writer = servletResponse.getWriter();//返回的是IO流中的字符输出流writer.println("<html><head></head><body>hello Servlet</body></html>");writer.close();}
此时容器不知道我们写了这个东西,需要url让别人请求你这个资源,我才能进行相应
所以我们需要在web->web-inf->web.xml下写一个配置
<web-app .....><servlet><servlet-name>MyFirstServlet</servlet-name><!--取一个名字,随便取--><servlet-class>ch02.demo.MyFirstServlet</servlet-class><!--对应着我项目中的这个类--></servlet><servlet-mapping><!--将这个servlet映射到这个url--><servlet-name>MyFirstServlet</servlet-name><!--对应着上面取的名字--><url-pattern>/myfirst</url-pattern></servlet-mapping>
</web-app>
以上的xml配置也可以用在类上面的注解实现
@WebServlet(name = "MyFirstServlet",urlPatterns = "/myFirstServlet")
public class MyFirstServlet implements Servlet {}
2.继承HttpServlet类
因为Servlet接口不只是提供Web的接口,因此我们可以使用它的子HttpServlet来代替它
public class MySecondServlet extends HttpServlet {//一个是为了处理get请求,一个处理post请求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter();//返回的是IO流中的字符输出流writer.println("<html><head></head><body>hello Servlet</body></html>");writer.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}
配置文件
<servlet><servlet-name>MySecondServlet</servlet-name><servlet-class>ch02.demo.MySecondServlet</servlet-class></servlet><servlet-mapping><servlet-name>MySecondServlet</servlet-name><url-pattern>/mysecond</url-pattern></servlet-mapping>
三.使用Servlet完成用户登录
a.创建一个用户登陆的html界面和登录成功的html
<html lang="en">
<head><!--登录界面--><meta charset="UTF-8"><title>用户登录</title>
</head>
<body>
<div align="center"><h1>用户登录</h1><form action="../login" method="post"><!--action与下面xml的url对应,要../是因为我的网页是写在ch02下,所以得跳上一级到web-->用户名:<input type="text" name="username"></br>密码:<input type="password" name="password"></br><input type="submit" value="登录"></input></form></div></body>
</html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录成功</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
b.创建Servlet
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}//当表单点击登录,都会默认以doPost方式提交@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户输入的用户名String username = req.getParameter("username");//需要与表单的name属性一致String password = req.getParameter("password");if(username.equals("admin")&& password.equals("123")){resp.sendRedirect("cho2/success.html");//跳转到指定页面}else{resp.sendRedirect("cho2/login.html");}}
}
c.配置文件中进行映射
<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>ch02.demo.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern><!--需要与html中的action对应--></servlet-mapping>
思考:
- 如果用户直接打开success.html会怎么样?
- 如何在用户名错误的情况下回到登录页面并显示错误信息?
- 如何在登录成功的情况下在success.html中显示用户的信息?
四.会话跟踪
1.Cookie
用户信息保存到客户端,不安全
public class LoginServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}//当表单点击登录,都会默认以doPost方式提交@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if(username.equals("admin")&& password.equals("123")){//创建cookie对象,把用户名保存到cookie中加到响应里Cookie cookie = new Cookie("username","admin");resp.addCookie( cookie);//把cookie加到响应中//resp.sendRedirect("ch03/success.html");//跳转到指定页面resp.sendRedirect("success");}else{resp.sendRedirect("ch03/login.html");}}
}
public class SuccessServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//拿取cookieCookie[] cookies = req.getCookies();boolean flag = false;for(Cookie cookie:cookies){if(cookie.getName().equals("username")&&cookie.getValue().equals("admin")){flag = true;break;}}resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();if(flag){out.print("<html lang=\"en\">\n" +"<head>\n" +" <meta charset=\"UTF-8\">\n" +" <title>登录成功</title>\n" +"</head>\n" +"<body>\n" +"<h1>Success</h1>\n" +"</body>\n" +"</html>");}}
}
<!DOCTYPE html>
<html lang="en">
<head><!--登录界面--><meta charset="UTF-8"><title>用户登录</title>
</head>
<body>
<div align="center"><h1>用户登录</h1><form action="../login1" method="post">用户名:<input type="text" name="username"></br>密码:<input type="password" name="password"></br><input type="submit" value="登录"></input></form></div></body>
</html>
<servlet><servlet-name>LoginServlet1</servlet-name><servlet-class>ch03.LoginServlet1</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet1</servlet-name><url-pattern>/login1</url-pattern></servlet-mapping><servlet><servlet-name>SuccessServlet</servlet-name><servlet-class>ch03.SuccessServlet</servlet-class></servlet><servlet-mapping><servlet-name>SuccessServlet</servlet-name><url-pattern>/success</url-pattern></servlet-mapping>
2.HttpSession
它是所有会话跟踪技术中最安全和最常用的技术
public class LoginServlet1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if(username.equals("admin")&& password.equals("123")){
// //创建cookie对象,把用户名保存到cookie中加到响应里
// Cookie cookie = new Cookie("username","admin");
// resp.addCookie( cookie);//把cookie加到响应中HttpSession session = req.getSession();//创建session对象session.setAttribute("username","admin");//保存用户名到session中resp.sendRedirect("success");}else{resp.sendRedirect("ch03/login.html");}}
}
public class SuccessServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// //拿取cookie
// Cookie[] cookies = req.getCookies();
// boolean flag = false;
// for(Cookie cookie:cookies){
// if(cookie.getName().equals("username")&&cookie.getValue().equals("admin")){
// flag = true;
// break;
// }
// }HttpSession session = req.getSession();//拿到同一个 sessionString username = (String)session.getAttribute("username");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();if(username!=null&&username.equals("admin")){out.print("<html lang=\"en\">\n" +"<head>\n" +" <meta charset=\"UTF-8\">\n" +" <title>登录成功</title>\n" +"</head>\n" +"<body>\n" +"<h1>Success</h1>\n" +"</body>\n" +"</html>");}}
}
五.Web开发模式MVC
示例:
jsp放在WEB-INF目录下,让用户不能直接访问
/*POJO: Plain Old Java Object仅用于封装数据*/
public class User {private String name;private String password;public User() {}public User(String name, String password) {this.name = name;this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}
}
/*Service:BusinessBean业务逻辑Bean,完成业务逻辑功能*/
public class UserService {private String msg;public boolean login(User user){if(user.getName().length()>8){this.msg = "用户名长度不能超过8位";return false;}if(user.getPassword().length()>16){this.msg = "密码长度不能超过16位";return false;}.................return false;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}