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 {
@Override
//初始化方法调用时机;默认情况下,Servlet被第一次访问时调用
//调用次数:1次
public void init(ServletConfig servletConfig) throws ServletException {}
@Override
public ServletConfig getServletConfig() {
return null;}
//调用时机:每次servlet被访问时调用
//调用次数:多次
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;}
@Override
public void destroy() {}
}
此时我想把响应打在对应的网页上就在Service中写,就写以下逻辑
//真正处理请求的方法
@Override
public 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请求
@Override
protected 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();
}
@Override
protected 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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
//当表单点击登录,都会默认以doPost方式提交
@Override
protected 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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
//当表单点击登录,都会默认以doPost方式提交
@Override
protected 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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected 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;
}
}
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>
缺点:
- 移动端App无法使用Cookie
- 不安全,用户可以自己禁用Cookie
- Cookie不能跨域
2.HttpSession
它是所有会话跟踪技术中最安全和最常用的技术
public class LoginServlet1 extends HttpServlet {
@Override
protected 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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected 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();//拿到同一个 session
String 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>");
}
}
}
缺点:
- 服务器集群环境下无法直接使用Session
- Cookie的缺点
五.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;
}
@Override
public 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;
}
}
更多推荐
所有评论(0)