java web(三)
2016-07-07 21:39
387 查看
从前面的项目我们可以看到有很多不方便的地方,比如web.xml要配置很多东西,还有PrintWriter要print好多html代码
使用后缀匹配模式修改web.xml
获取请求的资源路径,依据不同结果调用不同的分支操作类来完成操作。
具体操作是这样的:
将所有对员工的操作写在一个类中
将操作类单独写为一个类,通过对request的uri进行处理得到请求资源路径,并根据路径选取不同的分支操作。
3.需要注意的是,将删除和修改对应的href修改
4.修改web.xml文件
web.xml整个变得很清爽了~
特点:
唯一性(一个web应用对应一个servlet)
一直存在(只要容器不关闭,应用没有被卸载删除,ServletContext就一直存在)
我们可以用
下面一个简单的统计页面访问次数的代码
web.xml:
context.Context01Servlet
完整项目请看github
精简web.xml
针对web.xml要配置很多东西,我们其实有更简单的方法:使用后缀匹配模式修改web.xml
获取请求的资源路径,依据不同结果调用不同的分支操作类来完成操作。
具体操作是这样的:
将所有对员工的操作写在一个类中
public class EmployeeDao { /** * 获得所有员工信息 * @return */ public List<Employee> findAll() { List<Employee> list = new ArrayList<Employee>(); Connection conn = null; PreparedStatement perstat = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); perstat = conn.prepareStatement("select * from t_emp"); rs = perstat.executeQuery(); while (rs.next()) { Employee emp = new Employee(rs.getInt("id"), rs.getString("name"), rs.getString("salary"), rs.getString("age")); list.add(emp); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBUtil.close(conn); } return list; } /** * 根据id删除某员工信息 * @param id */ public void delete(int id) { Connection conn = null; PreparedStatement perstat = null; boolean rs = false; try{ conn = DBUtil.getConnection(); perstat = conn.prepareStatement("DELETE FROM t_emp WHERE id=?"); perstat.setInt(1, id); rs = perstat.execute(); }catch(Exception e){ e.printStackTrace(); }finally{ DBUtil.close(conn); } } /** * 插入员工数据 * @param emp */ public void save(Employee emp) { Connection conn = null; PreparedStatement perstat = null; try{ conn = DBUtil.getConnection(); perstat = conn.prepareStatement("INSERT INTO t_emp (name," + "salary,age) VALUES (?,?,?);"); perstat.setString(1, emp.getName()); perstat.setString(2, emp.getSalary()); perstat.setString(3, emp.getAge()); perstat.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ DBUtil.close(conn); } } /** * 根据id查找员工 * @param id * @return */ public Employee findById(int id) { Connection conn = null; PreparedStatement perstat = null; ResultSet rs = null; Employee emp = null; try{ conn = DBUtil.getConnection(); perstat = conn.prepareStatement("select * from t_emp where id=?"); perstat.setInt(1, id); rs = perstat.executeQuery(); if(rs.next()){ emp = new Employee(rs.getInt("id"), rs.getString("name"), rs.getString("salary"), rs.getString("age")); } }catch(Exception e){ e.printStackTrace(); }finally{ DBUtil.close(conn); } return emp; } /** * 修改员工信息 * @param emp */ public void modify(Employee emp) { Connection conn = null; PreparedStatement perstat = null; ResultSet rs = null; try{ conn = DBUtil.getConnection(); perstat = conn.prepareStatement("REPLACE INTO t_emp VALUES (?,?,?,?)"); perstat.setInt(1, emp.getId()); perstat.setString(2, emp.getName()); perstat.setString(3, emp.getSalary()); perstat.setString(4, emp.getAge()); perstat.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ DBUtil.close(conn); } } }
将操作类单独写为一个类,通过对request的uri进行处理得到请求资源路径,并根据路径选取不同的分支操作。
//获取请求uri String uri = request.getRequestURI(); //获取请求资源路径中除应用名之外的部分 String action = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf(".")); if(action.equals("list")){ ... } else if(action.equals("add")){ ... }...
3.需要注意的是,将删除和修改对应的href修改
<a href='load.do?id=xxx'>修改</a>
4.修改web.xml文件
<servlet> <servlet-name>actionServlet</servlet-name> <servlet-class>emp.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
web.xml整个变得很清爽了~
ServletContext
有的网站要获取访问量等,可以用到ServletContext特点:
唯一性(一个web应用对应一个servlet)
一直存在(只要容器不关闭,应用没有被卸载删除,ServletContext就一直存在)
我们可以用
getServletContext()方法获取ServletContext
下面一个简单的统计页面访问次数的代码
web.xml:
<!-- servletContext --> <context-param> <param-name>count</param-name> <param-value>1000</param-value> </context-param> <!-- servlet01 --> <servlet> <servlet-name>ServletContext01</servlet-name> <servlet-class>context.Context01Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletContext01</servlet-name> <url-pattern>/servlet01</url-pattern> </servlet-mapping> <!-- servlet02 --> <servlet> <servlet-name>ServletContext02</servlet-name> <servlet-class>context.Context02Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletContext02</servlet-name> <url-pattern>/servlet02</url-pattern> </servlet-mapping>
context.Context01Servlet
public class Context01Servlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); ServletContext context = getServletContext(); Object count = context.getAttribute("count"); if(count == null){ context.setAttribute("count", context.getInitParameter("count")); }else{ context.setAttribute("count", Integer.parseInt(count.toString())+1); } out.println("总浏览量为:"+context.getAttribute("count")); } }
关于线程安全
多个用户访问同一个servlet时,也就意味着多个线程访问同一个servlet,这时,需要对代码块加锁。synchronized (this) { count++; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+";"+count); }
完整项目请看github
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- GUI - Web前端开发框架
- 介绍一款信息管理系统的开源框架---jeecg
- Extjs4.0 最新最全视频教程
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序