您的位置:首页 > 编程语言 > Java开发

java web(三)

2016-07-07 21:39 330 查看
从前面的项目我们可以看到有很多不方便的地方,比如web.xml要配置很多东西,还有PrintWriter要print好多html代码

精简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 web