JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段作映射 ORM:
ORM:对象关系映射
- 表->类
- 字段->属性
- 行记录->对象
eg:
id | name | score | class |
---|---|---|---|
1 | 小a | 96 | 1班 |
2 | 小b | 97 | 2班 |
3 | 小c | 98 | 3班 |
class people{
private int id;
private String name;
private int id;
private String address
}
class A{
new people(1,"小a",96,1班);
...
}
MVC三层架构
基本概念:Model view Controller 模型、视图、控制器
1.早些年的架构
用户直接访问控制层,控制层就可以直接操作数据库
servlet-->CRUD-->数据库
弊端:程序不利于维护
servlet代码里面又有处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
架构:
2.MVC三层架构
Model:
- 业务处理:业务逻辑(service)
- 数据持久层:CRUD(Dao)
View:
- 展示数据
- 提供链接发起Servlet请求(form、img…)
Controller(Servlet):
- 接收用户的请求:(req:请求参数、Session信息…)
- 交给业务层处理对应的代码
- 控制视图跳转
登录——>接收用户的登录请求——>处理用户请求(获取登录用户的参数,username,password)——>
交给业务层处理登录业务(判断用户名密码是否正确)-->Dao层查询用户名和密码是否正确-->数据库
Filter(重要)
基本概念:过滤器,用来过滤网站的数据:
- 处理中文乱码
- 登录验证…
Filter步骤:
- 导包
-
编写过滤器
实现filter接口,重写对应的方法
import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { //初始化:web服务器启动就会初始化,随时等待过滤对象的出现 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("中文乱码过滤器初始化"); } //chain:链 /* * 1.过滤中的所有代码,在过滤特地的请求的时候就会执行 * 2.必须要让过滤器继续同行*/ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); System.out.println("过滤器执行前"); filterChain.doFilter(servletRequest,servletResponse);//让请求继续走,如果不写程序就到这停止 System.out.println("过滤器执行后"); } //销毁 @Override public void destroy() { System.out. println("中文乱码过滤器销毁"); } }
-
在web.xml中配置Filter
<filter>
<filter-name>filter01</filter-name>
<filter-class>filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<!-- 只要是/servlet后的如何请求,会经过逐个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
下面是对随意一个servlet进行测试,servlet-mapping映射有两个路径,一个**/servlet/show**,一个**/show**:
当输入路径为/show时:
当输入路径为/servlet/show时:
Filter实现权限拦截
前言:做一个登录页面
login.jsp登录页面(用表单来实现):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--注意这个action里面的路径要和登录的servlet的映射路径一致--%>
<form action="/servlet/login" method="post">
<input type="text" name="username">
<input type="submit">
</form>
</body>
</html>
LoginServlet实现登录的servlet:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端请求的参数
String username = req.getParameter("username");
if(username.equals("admin")){//登录成功
req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
}else{
//登录失败
resp.sendRedirect("/error.jsp");
}
}
error.jsp如果登录失败则显示错误页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>没有权限</h1>
<a href="/login.jsp">返回登录页面</a>
</body>
</html>
success.jsp登录成功的页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>进入主页</h1>
<%--页面跳转--%>
<p><a href="/servlet/logout">注销</a></p>
</body>
</html>
LoginOut当登录成功后想要注销登录:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object user_session = req.getSession().getAttribute("USER_SESSION");
if(user_session != null){//说明现在是登录状态,user_session的值是那个常量
req.getSession().removeAttribute("USER_SESSION");
resp.sendRedirect("/login.jsp");
}else{
resp.sendRedirect("/login.jsp");
}
}
要想在进入主页的时候判断用户是否登录,则要用到过滤器:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//因为像方法传进来的参数的的请求和响应没有getsessiond()这个方法,所以需要强转化为HttpServletRequest
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
Object user_session = request.getSession().getAttribute("USER_SESSION");
if(request.getSession().getAttribute("USER_SESSION") ==null){
response.sendRedirect("/error.jsp");
}
//确保代码能够继续运行
filterChain.doFilter(servletRequest, servletResponse);
}
注:如果测试的时候,出现404这种报错:
可以检查上面的路径是否正确,路径是要按照tomcat的部署路径来写的:
监听器
实现一个监听器的接口
-
编写一个监听器
实现监听器接口
import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; //统计网站在线人数,统计session public class OnlineCount implements HttpSessionListener { // 创建session的监听 @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { ServletContext context = httpSessionEvent.getSession().getServletContext(); Integer onlinecount = (Integer) context.getAttribute("onlinecount"); if(onlinecount==null){ //说明是第一个用户 onlinecount = new Integer(1); }else { int count = onlinecount.intValue();//将自己赋值给count onlinecount = new Integer(count+1); } context.setAttribute("onlinecount",onlinecount); } //销毁session的监听 @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { ServletContext context = httpSessionEvent.getSession().getServletContext(); Integer onlinecount = (Integer) context.getAttribute("onlinecount"); if(onlinecount==null){ //说明是第一个用户 onlinecount = new Integer(0); }else { int count = onlinecount.intValue();//将自己赋值给count onlinecount = new Integer(count-1); } context.setAttribute("onlinecount",onlinecount); } /* * session销毁 * 1.手动销毁:getSession().invalidate(); * 2.自动销毁*/ }
-
配置监听器,在web.xml中注册监听器
<!-- 注册监听器-->
<listener>
<listener-class>listener.OnlineCount</listener-class>
</listener>
测试:
在index.jsp中获取监听器参数:
<h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("onlinecount")%></span>人在线</h1>
点击启动tomcat
注:有2个是因为链接服务器的时候有可能失败了,但是session已经创建,所以会加一,一个客户端访问就会加一次,不同浏览器算作不同客户端。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84181.html