只用Spring Spring MVC 简单搭建一个web项目
项目包括 :
1.前端jsp,这里就只例举几个jsp:从 index.jsp点击操作 通过后端处理 返回显示到 fee_list.jsp页面
2.控制层 @controller:
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import cn.tedu.netctoss.service.CostService;
@Controller //控制层注解,让容器来管理
public class CostController {
@Resource(name="costService")//通过Spring依赖注入创建对象
private CostService cost;
@RequestMapping("/toFeeList.do")//响应前端请求
public String feeList(HttpServletRequest req) {
req.setAttribute("feeList", cost.findAll());
return "fee_list";//返回jsp名,后缀又配置文件配置
}
}
3.业务层 @service(interface)和 serviceImpl 主要进行逻辑操作:
//service服务层接口
public interface CostService {
public List<Cost> findAll();
}
//service接口实现类
@Service("costService") //交给容器来管理
public class CostServiceImpl implements CostService {
@Resource(name="costDAO")
private CostDAO c;
public List<Cost> findAll() {
return c.findAll();
}
}
4.dao层 ,数据访问层。 主要对数据库操作执行sql语句,也是用的两层结构:
@Repository该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
- @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
- @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
- @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的
注解参考:https://www.cnblogs.com/qq3111901846/p/7894543.html
public interface CostDAO {
public List<Cost> findAll();
}
@Repository("costDAO")//@Repository用于标注数据访问组件,用于将数据访问层 (DAO 层 ) 的类标
//识为 Spring Bean
public class CostDAOjdbc implements CostDAO {
@Resource(name="ds")
private DataSource ds;
List<Cost> list;
private Integer costId;
private String name ;
private Integer baseDuration ;
private Double baseCost ;
private Double unitCost ;
private String status ;
private String descr ;
private Timestamp creatime ;
private Timestamp startime ;
private String costType;
public List<Cost> findAll() {
Connection conn=null;
try {
//创建数据库连接,执行sql语句,获取返回结果
conn=ds.getConnection();
Statement s=conn.createStatement();
String sql="select * from cost_wh order by cost_id";
ResultSet rs=s.executeQuery(sql);
list=new ArrayList<Cost>();
while(rs.next()) {
Cost c=new Cost();
costId=rs.getInt("cost_id");
name=rs.getString("name");
baseDuration=rs.getInt("base_duration");
baseCost=rs.getDouble("base_cost");
unitCost=rs.getDouble("unit_cost");
status=rs.getString("status");
descr=rs.getString("descr");
creatime=rs.getTimestamp("creatime");
startime=rs.getTimestamp("startime");
costType=rs.getString("cost_type");
c.setCostId(costId);
c.setName(name);
c.setBaseDuration(baseDuration);
c.setBaseCost(baseCost);
c.setUnitCost(unitCost);
c.setStatus(status);
c.setDescr(descr);
c.setCreatime(creatime);
c.setStartime(startime);
c.setCostType(costType);
list.add(c);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
}
5.Spring 配置文件:
要使用spring mvc中的@Controller注解,就必须要配置<mvc:annotation-driven />,否则org.springframework.web.servlet.DispatcherServlet无法找到控制器并把请求分发到控制器。否则都会交给<mvc:default-servlet-handler/>即default servlet处理
<!--注解扫描 @Service @Repository等,扫描到后注册为Spring的bean-->
<context:component-scan base-package="com.src"/>
<mvc:annotation-driven />
<!--视图解析器配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<!--jdbc连接配置-->
<util:properties id="db" location="classpath:db.properties"/>
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="#{db.driver}"></property>
<property name="url" value="#{db.url}"></property>
<property name="username" value="#{db.user}"></property>
<property name="password" value="#{db.pwd}"></property>
</bean>
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/toLogin.do"/>
<mvc:exclude-mapping path="/login.do"/>
<bean class="com.src.interceptors.SessionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
6.拦截器:
类实现HandlerInterceptor,并在配置文件中配置拦截条件。当DispatcherServelt֮匹配请求时,拦截器会匹配请求之前运行preHandle()拦截处理除排除在外的所有请求
public class SessionInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandler()");
HttpSession session=request.getSession();
Object obj=session.getAttribute("admin");
//判断是否已经登录了用户
if(obj==null) {
response.sendRedirect("toLogin.do");
return false;
}
else {
//继续访问
return true;
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}